From d277d0d2834155fab91bd909f0460d5628555499 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Wed, 1 Jan 2025 20:46:56 +0100 Subject: [PATCH 01/32] feat: get all token balances --- .../app/api/chat/route.ts | 80 +++++++++--------- .../data/DefaultRetrievalText.ts | 2 +- .../utils/markdownToHTML.ts | 30 +++---- src/actions/balance.ts | 1 - src/actions/createOrcaSingleSidedWhirlpool.ts | 2 +- src/actions/index.ts | 57 ++++++------- src/agent/index.ts | 30 +++++-- src/tools/get_balance.ts | 49 ++++++++++- src/utils/tokenMetadata.ts | 83 +++++++++++++++++++ test/index.ts | 2 +- 10 files changed, 239 insertions(+), 97 deletions(-) create mode 100644 src/utils/tokenMetadata.ts diff --git a/examples/agent-kit-nextjs-langchain/app/api/chat/route.ts b/examples/agent-kit-nextjs-langchain/app/api/chat/route.ts index 06e6911..badd6b3 100644 --- a/examples/agent-kit-nextjs-langchain/app/api/chat/route.ts +++ b/examples/agent-kit-nextjs-langchain/app/api/chat/route.ts @@ -5,24 +5,24 @@ import { createReactAgent } from "@langchain/langgraph/prebuilt"; import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit"; const llm = new ChatOpenAI({ - temperature: 0.7, - model: "gpt-4o-mini", + temperature: 0.7, + model: "gpt-4o-mini", }); const solanaAgent = new SolanaAgentKit( - process.env.SOLANA_PRIVATE_KEY!, - process.env.RPC_URL, - process.env.OPENAI_API_KEY!, + process.env.SOLANA_PRIVATE_KEY!, + process.env.RPC_URL, + process.env.OPENAI_API_KEY!, ); const tools = createSolanaTools(solanaAgent); const memory = new MemorySaver(); const agent = createReactAgent({ - llm, - tools, - checkpointSaver: memory, - messageModifier: ` + llm, + tools, + checkpointSaver: memory, + messageModifier: ` You are a helpful agent that can interact onchain using the Solana Agent Kit. You are empowered to interact onchain using your tools. If you ever need funds, you can request them from the faucet. If not, you can provide your wallet details and request funds from the user. If there is a 5XX @@ -34,38 +34,38 @@ const agent = createReactAgent({ }); export async function POST(req: NextRequest) { - try { - const body = await req.json(); - const messages = body.messages ?? []; + try { + const body = await req.json(); + const messages = body.messages ?? []; - const eventStream = agent.streamEvents( - { - messages, - }, - { - version: "v2", - configurable: { - thread_id: "Solana Agent Kit!", - }, - }, - ); + const eventStream = agent.streamEvents( + { + messages, + }, + { + version: "v2", + configurable: { + thread_id: "Solana Agent Kit!", + }, + }, + ); - const textEncoder = new TextEncoder(); - const transformStream = new ReadableStream({ - async start(controller) { - for await (const { event, data } of eventStream) { - if (event === "on_chat_model_stream") { - if (!!data.chunk.content) { - controller.enqueue(textEncoder.encode(data.chunk.content)); - } - } - } - controller.close(); - }, - }); + const textEncoder = new TextEncoder(); + const transformStream = new ReadableStream({ + async start(controller) { + for await (const { event, data } of eventStream) { + if (event === "on_chat_model_stream") { + if (data.chunk.content) { + controller.enqueue(textEncoder.encode(data.chunk.content)); + } + } + } + controller.close(); + }, + }); - return new Response(transformStream); - } catch (e: any) { - return NextResponse.json({ error: e.message }, { status: e.status ?? 500 }); - } + return new Response(transformStream); + } catch (e: any) { + return NextResponse.json({ error: e.message }, { status: e.status ?? 500 }); + } } diff --git a/examples/agent-kit-nextjs-langchain/data/DefaultRetrievalText.ts b/examples/agent-kit-nextjs-langchain/data/DefaultRetrievalText.ts index 898acba..6973d98 100644 --- a/examples/agent-kit-nextjs-langchain/data/DefaultRetrievalText.ts +++ b/examples/agent-kit-nextjs-langchain/data/DefaultRetrievalText.ts @@ -537,4 +537,4 @@ const executor = await initializeAgentExecutorWithOptions(tools, llm, { }, }); \`\`\` -`; \ No newline at end of file +`; diff --git a/examples/agent-kit-nextjs-langchain/utils/markdownToHTML.ts b/examples/agent-kit-nextjs-langchain/utils/markdownToHTML.ts index dc265b1..135fdd9 100644 --- a/examples/agent-kit-nextjs-langchain/utils/markdownToHTML.ts +++ b/examples/agent-kit-nextjs-langchain/utils/markdownToHTML.ts @@ -2,29 +2,29 @@ import { marked } from "marked"; import DOMPurify from "isomorphic-dompurify"; interface MarkedOptions { - gfm: boolean; - breaks: boolean; - headerIds: boolean; - mangle: false; - highlight?: (code: string, lang: string) => string; + gfm: boolean; + breaks: boolean; + headerIds: boolean; + mangle: false; + highlight?: (code: string, lang: string) => string; } // Configure marked options const markedOptions: MarkedOptions = { - gfm: true, // GitHub Flavored Markdown - breaks: true, // Convert \n to
- headerIds: true, // Add ids to headers - mangle: false, // Don't escape HTML - highlight: function (code: string, lang: string): string { - // You can add syntax highlighting here if needed - return code; - }, + gfm: true, // GitHub Flavored Markdown + breaks: true, // Convert \n to
+ headerIds: true, // Add ids to headers + mangle: false, // Don't escape HTML + highlight: function (code: string, lang: string): string { + // You can add syntax highlighting here if needed + return code; + }, }; marked.setOptions(markedOptions); // Basic markdown to HTML conversion with sanitization export default function markdownToHtml(markdown: string) { - const rawHtml = marked.parse(markdown); - return DOMPurify.sanitize(rawHtml as string); + const rawHtml = marked.parse(markdown); + return DOMPurify.sanitize(rawHtml as string); } diff --git a/src/actions/balance.ts b/src/actions/balance.ts index 381b2a5..1ee1b56 100644 --- a/src/actions/balance.ts +++ b/src/actions/balance.ts @@ -54,7 +54,6 @@ const balanceAction: Action = { return { status: "success", balance: balance, - token: input.tokenAddress || "SOL", }; }, }; diff --git a/src/actions/createOrcaSingleSidedWhirlpool.ts b/src/actions/createOrcaSingleSidedWhirlpool.ts index affc445..3a1fb52 100644 --- a/src/actions/createOrcaSingleSidedWhirlpool.ts +++ b/src/actions/createOrcaSingleSidedWhirlpool.ts @@ -87,7 +87,7 @@ const createOrcaSingleSidedWhirlpoolAction: Action = { const otherTokenMint = new PublicKey(input.otherTokenMint); const initialPrice = new Decimal(input.initialPrice); const maxPrice = new Decimal(input.maxPrice); - const feeTier = input.feeTier + const feeTier = input.feeTier; // Create the whirlpool const signature = await orcaCreateSingleSidedLiquidityPool( diff --git a/src/actions/index.ts b/src/actions/index.ts index b66c89e..1ccdb64 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -28,34 +28,35 @@ import createOrcaSingleSidedWhirlpoolAction from "./createOrcaSingleSidedWhirlpo import launchPumpfunTokenAction from "./launchPumpfunToken"; export const ACTIONS = { - "DEPLOY_TOKEN_ACTION" : deployTokenAction, - "BALANCE_ACTION" : balanceAction, - "TRANSFER_ACTION" : transferAction, - "DEPLOY_COLLECTION_ACTION" : deployCollectionAction, - "MINT_NFT_ACTION" : mintNFTAction, - "TRADE_ACTION" : tradeAction, - "REQUEST_FUNDS_ACTION" : requestFundsAction, - "RESOLVE_DOMAIN_ACTION" : resolveDomainAction, - "GET_TOKEN_DATA_ACTION" : getTokenDataAction, - "GET_TPS_ACTION" : getTPSAction, - "FETCH_PRICE_ACTION" : fetchPriceAction, - "STAKE_WITH_JUP_ACTION" : stakeWithJupAction, - "REGISTER_DOMAIN_ACTION" : registerDomainAction, - "LEND_ASSET_ACTION" : lendAssetAction, - "CREATE_GIBWORK_TASK_ACTION" : createGibworkTaskAction, - "RESOLVE_SOL_DOMAIN_ACTION" : resolveSolDomainAction, - "PYTH_FETCH_PRICE_ACTION" : pythFetchPriceAction, - "GET_OWNED_DOMAINS_FOR_TLD_ACTION" : getOwnedDomainsForTLDAction, - "GET_PRIMARY_DOMAIN_ACTION" : getPrimaryDomainAction, - "GET_ALL_DOMAINS_TLDS_ACTION" : getAllDomainsTLDsAction, - "GET_OWNED_ALL_DOMAINS_ACTION" : getOwnedAllDomainsAction, - "CREATE_IMAGE_ACTION" : createImageAction, - "GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION" : getMainAllDomainsDomainAction, - "GET_ALL_REGISTERED_ALL_DOMAINS_ACTION" : getAllRegisteredAllDomainsAction, - "RAYDIUM_CREATE_CPMM_ACTION" : raydiumCreateCpmmAction, - "RAYDIUM_CREATE_AMM_V4_ACTION" : raydiumCreateAmmV4Action, - "CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION" : createOrcaSingleSidedWhirlpoolAction, - "LAUNCH_PUMPFUN_TOKEN_ACTION" : launchPumpfunTokenAction, + DEPLOY_TOKEN_ACTION: deployTokenAction, + BALANCE_ACTION: balanceAction, + TRANSFER_ACTION: transferAction, + DEPLOY_COLLECTION_ACTION: deployCollectionAction, + MINT_NFT_ACTION: mintNFTAction, + TRADE_ACTION: tradeAction, + REQUEST_FUNDS_ACTION: requestFundsAction, + RESOLVE_DOMAIN_ACTION: resolveDomainAction, + GET_TOKEN_DATA_ACTION: getTokenDataAction, + GET_TPS_ACTION: getTPSAction, + FETCH_PRICE_ACTION: fetchPriceAction, + STAKE_WITH_JUP_ACTION: stakeWithJupAction, + REGISTER_DOMAIN_ACTION: registerDomainAction, + LEND_ASSET_ACTION: lendAssetAction, + CREATE_GIBWORK_TASK_ACTION: createGibworkTaskAction, + RESOLVE_SOL_DOMAIN_ACTION: resolveSolDomainAction, + PYTH_FETCH_PRICE_ACTION: pythFetchPriceAction, + GET_OWNED_DOMAINS_FOR_TLD_ACTION: getOwnedDomainsForTLDAction, + GET_PRIMARY_DOMAIN_ACTION: getPrimaryDomainAction, + GET_ALL_DOMAINS_TLDS_ACTION: getAllDomainsTLDsAction, + GET_OWNED_ALL_DOMAINS_ACTION: getOwnedAllDomainsAction, + CREATE_IMAGE_ACTION: createImageAction, + GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION: getMainAllDomainsDomainAction, + GET_ALL_REGISTERED_ALL_DOMAINS_ACTION: getAllRegisteredAllDomainsAction, + RAYDIUM_CREATE_CPMM_ACTION: raydiumCreateCpmmAction, + RAYDIUM_CREATE_AMM_V4_ACTION: raydiumCreateAmmV4Action, + CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: + createOrcaSingleSidedWhirlpoolAction, + LAUNCH_PUMPFUN_TOKEN_ACTION: launchPumpfunTokenAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/agent/index.ts b/src/agent/index.ts index 4acf694..8191a80 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -83,24 +83,30 @@ export class SolanaAgentKit { * @deprecated Using openai_api_key directly in constructor is deprecated. * Please use the new constructor with Config object instead: * @example - * const agent = new SolanaAgentKit(privateKey, rpcUrl, { + * const agent = new SolanaAgentKit(privateKey, rpcUrl, { * OPENAI_API_KEY: 'your-key' * }); */ - constructor(private_key: string, rpc_url: string, openai_api_key: string | null); + constructor( + private_key: string, + rpc_url: string, + openai_api_key: string | null, + ); constructor(private_key: string, rpc_url: string, config: Config); constructor( private_key: string, rpc_url: string, configOrKey: Config | string | null, ) { - this.connection = new Connection(rpc_url || "https://api.mainnet-beta.solana.com"); + this.connection = new Connection( + rpc_url || "https://api.mainnet-beta.solana.com", + ); this.wallet = Keypair.fromSecretKey(bs58.decode(private_key)); this.wallet_address = this.wallet.publicKey; // Handle both old and new patterns - if (typeof configOrKey === 'string' || configOrKey === null) { - this.config = { OPENAI_API_KEY: configOrKey || '' }; + if (typeof configOrKey === "string" || configOrKey === null) { + this.config = { OPENAI_API_KEY: configOrKey || "" }; } else { this.config = configOrKey; } @@ -127,7 +133,19 @@ export class SolanaAgentKit { return deploy_collection(this, options); } - async getBalance(token_address?: PublicKey): Promise { + async getBalance(token_address?: PublicKey): Promise< + | number + | { + sol: number; + tokens: Array<{ + tokenAddress: string; + name: string; + symbol: string; + balance: number; + decimals: number; + }>; + } + > { return get_balance(this, token_address); } diff --git a/src/tools/get_balance.ts b/src/tools/get_balance.ts index a1e3736..3e30021 100644 --- a/src/tools/get_balance.ts +++ b/src/tools/get_balance.ts @@ -1,5 +1,7 @@ import { LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; import { SolanaAgentKit } from "../index"; +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { getTokenMetadata } from "../utils/tokenMetadata"; /** * Get the balance of SOL or an SPL token for the agent's wallet @@ -10,12 +12,51 @@ import { SolanaAgentKit } from "../index"; export async function get_balance( agent: SolanaAgentKit, token_address?: PublicKey, -): Promise { +): Promise< + | number + | { + sol: number; + tokens: Array<{ + tokenAddress: string; + name: string; + symbol: string; + balance: number; + decimals: number; + }>; + } +> { if (!token_address) { - return ( - (await agent.connection.getBalance(agent.wallet_address)) / - LAMPORTS_PER_SOL + const [lamportsBalance, tokenAccountData] = await Promise.all([ + agent.connection.getBalance(agent.wallet_address), + agent.connection.getParsedTokenAccountsByOwner(agent.wallet_address, { + programId: TOKEN_PROGRAM_ID, + }), + ]); + + const removedZeroBalance = tokenAccountData.value.filter( + (v) => v.account.data.parsed.info.tokenAmount.uiAmount !== 0, ); + + const tokenBalances = await Promise.all( + removedZeroBalance.map(async (v) => { + const mint = v.account.data.parsed.info.mint; + const mintInfo = await getTokenMetadata(agent.connection, mint); + return { + tokenAddress: mint, + name: mintInfo.name ?? "", + symbol: mintInfo.symbol ?? "", + balance: v.account.data.parsed.info.tokenAmount.uiAmount as number, + decimals: v.account.data.parsed.info.tokenAmount.decimals as number, + }; + }), + ); + + const solBalance = lamportsBalance / LAMPORTS_PER_SOL; + + return { + sol: solBalance, + tokens: tokenBalances, + }; } const token_account = diff --git a/src/utils/tokenMetadata.ts b/src/utils/tokenMetadata.ts new file mode 100644 index 0000000..514a208 --- /dev/null +++ b/src/utils/tokenMetadata.ts @@ -0,0 +1,83 @@ +import { Connection, PublicKey } from "@solana/web3.js"; + +export async function getTokenMetadata( + connection: Connection, + tokenMint: string, +) { + const METADATA_PROGRAM_ID = new PublicKey( + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + ); + + const [metadataPDA] = PublicKey.findProgramAddressSync( + [ + Buffer.from("metadata"), + METADATA_PROGRAM_ID.toBuffer(), + new PublicKey(tokenMint).toBuffer(), + ], + METADATA_PROGRAM_ID, + ); + + const metadata = await connection.getAccountInfo(metadataPDA); + if (!metadata?.data) { + throw new Error("Metadata not found"); + } + + let offset = 1 + 32 + 32; // key + update auth + mint + const data = metadata.data; + const decoder = new TextDecoder(); + + // Read variable length strings + const readString = () => { + let nameLength = data[offset]; + + while (nameLength === 0) { + offset++; + nameLength = data[offset]; + if (offset >= data.length) { + return null; + } + } + + offset++; + const name = decoder + .decode(data.slice(offset, offset + nameLength)) + // @eslint-disable-next-line no-control-regex + .replace(new RegExp(String.fromCharCode(0), "g"), ""); + offset += nameLength; + return name; + }; + + const name = readString(); + const symbol = readString(); + const uri = readString(); + + // Read remaining data + const sellerFeeBasisPoints = data.readUInt16LE(offset); + offset += 2; + + let creators: + | { address: PublicKey; verified: boolean; share: number }[] + | null = null; + if (data[offset] === 1) { + offset++; + const numCreators = data[offset]; + offset++; + creators = [...Array(numCreators)].map(() => { + const creator = { + address: new PublicKey(data.slice(offset, offset + 32)), + verified: data[offset + 32] === 1, + share: data[offset + 33], + }; + offset += 34; + return creator; + }); + } + + return { + name, + symbol, + uri, + sellerFeeBasisPoints, + creators, + }; +} diff --git a/test/index.ts b/test/index.ts index 2a3312b..00f9976 100644 --- a/test/index.ts +++ b/test/index.ts @@ -1,4 +1,4 @@ -import { SolanaAgentKit , ACTIONS} from "../src"; +import { SolanaAgentKit, ACTIONS } from "../src"; import { createSolanaTools } from "../src/langchain"; import { HumanMessage } from "@langchain/core/messages"; import { MemorySaver } from "@langchain/langgraph"; From b56116df09fe6c9f1461e4345319b53b41696017 Mon Sep 17 00:00:00 2001 From: jakeyvee Date: Sat, 4 Jan 2025 13:05:31 +0800 Subject: [PATCH 02/32] feat: add Voltr check balance, deposit and withdraw strategy --- package.json | 1 + pnpm-lock.yaml | 7537 ++++++++++++++++---------- src/agent/index.ts | 23 + src/langchain/index.ts | 88 + src/tools/index.ts | 4 + src/tools/voltr_deposit_strategy.ts | 77 + src/tools/voltr_get_asset_amount.ts | 33 + src/tools/voltr_withdraw_strategy.ts | 97 + 8 files changed, 5066 insertions(+), 2794 deletions(-) create mode 100644 src/tools/voltr_deposit_strategy.ts create mode 100644 src/tools/voltr_get_asset_amount.ts create mode 100644 src/tools/voltr_withdraw_strategy.ts diff --git a/package.json b/package.json index 5b2c3e4..f34069a 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@tensor-oss/tensorswap-sdk": "^4.5.0", "@solana/web3.js": "^1.98.0", "@tiplink/api": "^0.3.1", + "@voltr/sdk": "^0.1.0", "bn.js": "^5.2.1", "bs58": "^6.0.0", "chai": "^5.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 947282b..754d7ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,162 +4,168 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -importers: +dependencies: + '@ai-sdk/openai': + specifier: ^1.0.11 + version: 1.0.13(zod@3.24.1) + '@bonfida/spl-name-service': + specifier: ^3.0.7 + version: 3.0.7(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@cks-systems/manifest-sdk': + specifier: ^0.1.73 + version: 0.1.73(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@coral-xyz/anchor': + specifier: '0.29' + version: 0.29.0 + '@langchain/core': + specifier: ^0.3.26 + version: 0.3.27(openai@4.77.3) + '@langchain/groq': + specifier: ^0.1.2 + version: 0.1.2(@langchain/core@0.3.27) + '@langchain/langgraph': + specifier: ^0.2.36 + version: 0.2.38(@langchain/core@0.3.27) + '@langchain/openai': + specifier: ^0.3.16 + version: 0.3.16(@langchain/core@0.3.27) + '@lightprotocol/compressed-token': + specifier: ^0.17.1 + version: 0.17.1(@lightprotocol/stateless.js@0.17.1)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@lightprotocol/stateless.js': + specifier: ^0.17.1 + version: 0.17.1 + '@metaplex-foundation/mpl-core': + specifier: ^1.1.1 + version: 1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.7.0) + '@metaplex-foundation/mpl-token-metadata': + specifier: ^3.3.0 + version: 3.3.0(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/mpl-toolbox': + specifier: ^0.9.4 + version: 0.9.4(@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) + '@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) + '@onsol/tldparser': + specifier: ^0.6.7 + version: 0.6.7(@solana/web3.js@1.98.0)(bn.js@5.2.1)(borsh@0.7.0)(buffer@6.0.1) + '@orca-so/common-sdk': + specifier: 0.6.4 + version: 0.6.4(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3) + '@orca-so/whirlpools-sdk': + specifier: ^0.13.12 + version: 0.13.13(@coral-xyz/anchor@0.29.0)(@orca-so/common-sdk@0.6.4)(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3) + '@pythnetwork/price-service-client': + specifier: ^1.9.0 + version: 1.9.0 + '@raydium-io/raydium-sdk-v2': + specifier: 0.1.95-alpha + version: 0.1.95-alpha(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-token': + specifier: ^0.4.9 + version: 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': + specifier: ^1.98.0 + version: 1.98.0 + '@tensor-oss/tensorswap-sdk': + specifier: ^4.5.0 + version: 4.5.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@tiplink/api': + specifier: ^0.3.1 + version: 0.3.1(fastestsmallesttextencoderdecoder@1.0.22)(sodium-native@3.4.1) + '@voltr/sdk': + specifier: ^0.1.0 + version: 0.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + ai: + specifier: ^4.0.22 + version: 4.0.25(react@19.0.0)(zod@3.24.1) + bn.js: + specifier: ^5.2.1 + version: 5.2.1 + bs58: + specifier: ^6.0.0 + version: 6.0.0 + chai: + specifier: ^5.1.2 + version: 5.1.2 + decimal.js: + specifier: ^10.4.3 + version: 10.4.3 + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + form-data: + specifier: ^4.0.1 + version: 4.0.1 + langchain: + specifier: ^0.3.8 + version: 0.3.9(@langchain/core@0.3.27)(@langchain/groq@0.1.2)(openai@4.77.3) + openai: + specifier: ^4.77.0 + version: 4.77.3(zod@3.24.1) + typedoc: + specifier: ^0.27.6 + version: 0.27.6(typescript@5.7.2) + zod: + specifier: ^3.24.1 + version: 3.24.1 - .: - dependencies: - '@ai-sdk/openai': - specifier: ^1.0.11 - version: 1.0.11(zod@3.24.1) - '@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) - '@cks-systems/manifest-sdk': - specifier: ^0.1.73 - version: 0.1.73(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.26 - 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.36 - version: 0.2.36(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) - '@langchain/openai': - specifier: ^0.3.16 - 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/mpl-toolbox': - specifier: ^0.9.4 - version: 0.9.4(@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)) - '@onsol/tldparser': - specifier: ^0.6.7 - version: 0.6.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bn.js@5.2.1)(borsh@2.0.0)(buffer@6.0.3)(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) - '@pythnetwork/price-service-client': - specifier: ^1.9.0 - version: 1.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@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.98.0 - version: 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@tensor-oss/tensorswap-sdk': - specifier: ^4.5.0 - version: 4.5.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) - '@tiplink/api': - specifier: ^0.3.1 - version: 0.3.1(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(sodium-native@3.4.1)(utf-8-validate@5.0.10) - ai: - specifier: ^4.0.22 - version: 4.0.22(react@19.0.0)(zod@3.24.1) - bn.js: - specifier: ^5.2.1 - version: 5.2.1 - bs58: - specifier: ^6.0.0 - version: 6.0.0 - chai: - specifier: ^5.1.2 - version: 5.1.2 - decimal.js: - specifier: ^10.4.3 - version: 10.4.3 - dotenv: - specifier: ^16.4.7 - version: 16.4.7 - form-data: - specifier: ^4.0.1 - version: 4.0.1 - langchain: - specifier: ^0.3.8 - version: 0.3.8(@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.77.0 - version: 4.77.0(zod@3.24.1) - typedoc: - specifier: ^0.27.6 - version: 0.27.6(typescript@5.7.2) - zod: - specifier: ^3.24.1 - version: 3.24.1 - devDependencies: - '@types/bn.js': - specifier: ^5.1.6 - version: 5.1.6 - '@types/chai': - specifier: ^5.0.1 - version: 5.0.1 - '@types/node': - specifier: ^22.10.2 - version: 22.10.2 - '@typescript-eslint/eslint-plugin': - specifier: ^8.18.2 - version: 8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/parser': - specifier: ^8.18.2 - version: 8.18.2(eslint@8.57.1)(typescript@5.7.2) - eslint: - specifier: ^8.56.0 - version: 8.57.1 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) - eslint-plugin-prettier: - specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) - prettier: - specifier: ^3.4.2 - version: 3.4.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 +devDependencies: + '@types/bn.js': + specifier: ^5.1.6 + version: 5.1.6 + '@types/chai': + specifier: ^5.0.1 + version: 5.0.1 + '@types/node': + specifier: ^22.10.2 + version: 22.10.5 + '@typescript-eslint/eslint-plugin': + specifier: ^8.18.2 + version: 8.19.0(@typescript-eslint/parser@8.19.0)(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': + specifier: ^8.18.2 + version: 8.19.0(eslint@8.57.1)(typescript@5.7.2) + eslint: + specifier: ^8.56.0 + version: 8.57.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.1) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.1)(prettier@3.4.2) + prettier: + specifier: ^3.4.2 + version: 3.4.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.10.5)(typescript@5.7.2) + typescript: + specifier: ^5.7.2 + version: 5.7.2 packages: - '@ai-sdk/openai@1.0.11': - resolution: {integrity: sha512-qI9s7Slma5i5bB4yYVlFdcG3PNDwdqivPT1Dr8adDX92nSSpILjgFIooS5yys9sXjvvcfOi/WXbDvVhLSRRlvg==} + /@ai-sdk/openai@1.0.13(zod@3.24.1): + resolution: {integrity: sha512-kuSLNM6nFy+lgEd6d0X9Bp4hXjPbEwtUbnIrI4jqa9uZZupHc9vh8rOF6XO8s6ZhrWYjnuYZmhvK0S4k+sHrsg==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 + dependencies: + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + zod: 3.24.1 + dev: false - '@ai-sdk/provider-utils@2.0.5': + /@ai-sdk/provider-utils@2.0.5(zod@3.24.1): resolution: {integrity: sha512-2M7vLhYN0ThGjNlzow7oO/lsL+DyMxvGMIYmVQvEYaCWhDzxH5dOp78VNjJIVwHzVLMbBDigX3rJuzAs853idw==} engines: {node: '>=18'} peerDependencies: @@ -167,12 +173,22 @@ packages: peerDependenciesMeta: zod: optional: true + dependencies: + '@ai-sdk/provider': 1.0.3 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + zod: 3.24.1 + dev: false - '@ai-sdk/provider@1.0.3': + /@ai-sdk/provider@1.0.3: resolution: {integrity: sha512-WiuJEpHTrltOIzv3x2wx4gwksAHW0h6nK3SoDzjqCOJLu/2OJ1yASESTIX+f07ChFykHElVoP80Ol/fe9dw6tQ==} engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false - '@ai-sdk/react@1.0.7': + /@ai-sdk/react@1.0.7(react@19.0.0)(zod@3.24.1): resolution: {integrity: sha512-j2/of4iCNq+r2Bjx0O9vdRhn5C/02t2Esenis71YtnsoynPz74eQlJ3N0RYYPheThiJes50yHdfdVdH9ulxs1A==} engines: {node: '>=18'} peerDependencies: @@ -183,8 +199,16 @@ packages: optional: true zod: optional: true + dependencies: + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) + react: 19.0.0 + swr: 2.3.0(react@19.0.0) + throttleit: 2.1.0 + zod: 3.24.1 + dev: false - '@ai-sdk/ui-utils@1.0.6': + /@ai-sdk/ui-utils@1.0.6(zod@3.24.1): resolution: {integrity: sha512-ZP6Vjj+VCnSPBIAvWAdKj2olQONJ/f4aZpkVCGkzprdhv8TjHwB6CTlXFS3zypuEGy4asg84dc1dvXKooQXFvg==} engines: {node: '>=18'} peerDependencies: @@ -192,8 +216,14 @@ packages: peerDependenciesMeta: zod: optional: true + dependencies: + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + dev: false - '@babel/runtime@7.26.0': + /@babel/runtime@7.26.0: resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} dependencies: @@ -204,2459 +234,6 @@ packages: resolution: {integrity: sha512-i28w9+BMFufhhpmLQCNx1CKKXTsEn+5RT18VFpPqdGO3sqaYlnUWC1m3wDpOvlzGk498dljgRpRo5wmcsnuEMg==} peerDependencies: '@solana/web3.js': ^1.87.3 - - '@bonfida/spl-name-service@3.0.7': - resolution: {integrity: sha512-okOLXhy+fQoyQ/sZgMleO5RrIZfTkWEoHMxWgUqg6RP/MTBlrKxlhKC6ymKn4UUe0C5s3Nb8A+3Ams7vX0nMDg==} - peerDependencies: - '@solana/web3.js': ^1.87.3 - - '@cfworker/json-schema@4.0.3': - resolution: {integrity: sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==} - - '@cks-systems/manifest-sdk@0.1.73': - resolution: {integrity: sha512-IcRM7k3YZ/jK5nJwE3xGp2Xg7Um4/XCeqrLs5yB3+IjS7W089Qs/prJXdRGKbFwCLkMt9ds6pElHufQr8an0Iw==} - - '@coral-xyz/anchor@0.26.0': - resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==} - engines: {node: '>=11'} - - '@coral-xyz/anchor@0.29.0': - resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} - engines: {node: '>=11'} - - '@coral-xyz/borsh@0.26.0': - resolution: {integrity: sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.68.0 - - '@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'} - - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - - '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - - '@ethersproject/bytes@5.7.0': - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - - '@ethersproject/logger@5.7.0': - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - '@ethersproject/sha2@5.7.0': - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - - '@gerrit0/mini-shiki@1.24.4': - resolution: {integrity: sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw==} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} - engines: {node: '>=18.18'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@langchain/core@0.3.26': - resolution: {integrity: sha512-6RUQHEp8wv+JwtYIIEBYBzbLlcAQZFc7EDOgAM0ukExjh9HiXoJzoWpgMRRCrr/koIbtwXPJUqBprZK1I1CXHQ==} - engines: {node: '>=18'} - - '@langchain/groq@0.1.2': - resolution: {integrity: sha512-bgQ9yGoNHOwG6LG2ngGvSNxF/1U1c1u3vKmFWmzecFIcBoQQOJY0jb0MrL3g1uTife0Sr3zxkWKXQg2aK/U4Sg==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.21 <0.4.0' - - '@langchain/langgraph-checkpoint@0.0.13': - resolution: {integrity: sha512-amdmBcNT8a9xP2VwcEWxqArng4gtRDcnVyVI4DsQIo1Aaz8e8+hH17zSwrUF3pt1pIYztngIfYnBOim31mtKMg==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.31 <0.4.0' - - '@langchain/langgraph-sdk@0.0.32': - resolution: {integrity: sha512-KQyM9kLO7T6AxwNrceajH7JOybP3pYpvUPnhiI2rrVndI1WyZUJ1eVC1e722BVRAPi6o+WcoTT4uMSZVinPOtA==} - - '@langchain/langgraph@0.2.36': - resolution: {integrity: sha512-zxk7ZCVxP0/Ut9785EiXCS7BE7sXd8cu943mcZUF2aNFUaQRTBbbiKpNdR3nb1+xO/B+HVktrJT2VFdkAywnng==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.36 <0.3.0 || >=0.3.9 < 0.4.0' - - '@langchain/openai@0.3.16': - resolution: {integrity: sha512-Om9HRlTeI0Ou6D4pfxbWHop4WGfkCdV/7v1W/+Jr7NSf0BNoA9jk5GqGms8ZtOYSGgPvizDu3i0TrM3B4cN4NA==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.26 <0.4.0' - - '@langchain/textsplitters@0.1.0': - resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.21 <0.4.0' - - '@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/beet-solana@0.3.1': - resolution: {integrity: sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==} - - '@metaplex-foundation/beet-solana@0.4.0': - resolution: {integrity: sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ==} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.4.0': - resolution: {integrity: sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA==} - - '@metaplex-foundation/beet@0.6.1': - resolution: {integrity: sha512-OYgnijLFzw0cdUlRKH5POp0unQECPOW9muJ2X3QIVyak5G6I6l/rKo72sICgPLIFKdmsi2jmnkuLY7wp14iXdw==} - - '@metaplex-foundation/beet@0.7.1': - resolution: {integrity: sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-auction-house@2.5.1': - resolution: {integrity: sha512-O+IAdYVaoOvgACB8pm+1lF5BNEjl0COkqny2Ho8KQZwka6aC/vHbZ239yRwAMtJhf5992BPFdT4oifjyE0O+Mw==} - - '@metaplex-foundation/mpl-bubblegum@0.7.0': - resolution: {integrity: sha512-HCo6q+nh8M3KRv9/aUaZcJo5/vPJEeZwPGRDWkqN7lUXoMIvhd83fZi7MB1rIg1gwpVHfHqim0A02LCYKisWFg==} - - '@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 - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@metaplex-foundation/mpl-token-metadata@3.3.0': - resolution: {integrity: sha512-t5vO8Wr3ZZZPGrVrGNcosX5FMkwQSgBiVMQMRNDG2De7voYFJmIibD5jdG05EoQ4Y5kZVEiwhYaO+wJB3aO5AA==} - peerDependencies: - '@metaplex-foundation/umi': '>= 0.8.2 < 1' - - '@metaplex-foundation/mpl-toolbox@0.9.4': - resolution: {integrity: sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ==} - peerDependencies: - '@metaplex-foundation/umi': '>= 0.8.2 < 1' - - '@metaplex-foundation/rustbin@0.3.5': - resolution: {integrity: sha512-m0wkRBEQB/8krwMwKBvFugufZtYwMXiGHud2cTDAv+aGXK4M90y0Hx67/wpu+AqqoQfdV8VM9YezUOHKD+Z5kA==} - - '@metaplex-foundation/solita@0.12.2': - resolution: {integrity: sha512-oczMfE43NNHWweSqhXPTkQBUbap/aAiwjDQw8zLKNnd/J8sXr/0+rKcN5yJIEgcHeKRkp90eTqkmt2WepQc8yw==} - hasBin: true - - '@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 - - '@metaplex-foundation/umi-downloader-http@0.9.2': - resolution: {integrity: sha512-tzPT9hBwenzTzAQg07rmsrqZfgguAXELbcJrsYMoASp5VqWFXYIP00g94KET6XLjWUXH4P1J2zoa6hGennPXHA==} - peerDependencies: - '@metaplex-foundation/umi': ^0.9.2 - - '@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 - - '@metaplex-foundation/umi-http-fetch@0.9.2': - resolution: {integrity: sha512-YCZuBu24T9ZzEDe4+w12LEZm/fO9pkyViZufGgASC5NX93814Lvf6Ssjn/hZzjfA7CvZbvLFbmujc6CV3Q/m9Q==} - peerDependencies: - '@metaplex-foundation/umi': ^0.9.2 - - '@metaplex-foundation/umi-options@0.8.9': - resolution: {integrity: sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==} - - '@metaplex-foundation/umi-program-repository@0.9.2': - resolution: {integrity: sha512-g3+FPqXEmYsBa8eETtUE2gb2Oe3mqac0z3/Ur1TvAg5TtIy3mzRzOy/nza+sgzejnfcxcVg835rmpBaxpBnjDA==} - peerDependencies: - '@metaplex-foundation/umi': ^0.9.2 - - '@metaplex-foundation/umi-public-keys@0.8.9': - resolution: {integrity: sha512-CxMzN7dgVGOq9OcNCJe2casKUpJ3RmTVoOvDFyeoTQuK+vkZ1YSSahbqC1iGuHEtKTLSjtWjKvUU6O7zWFTw3Q==} - - '@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2': - resolution: {integrity: sha512-YRwVf6xH0jPBAUgMhEPi+UbjioAeqTXmjsN2TnmQCPAmHbrHrMRj0rlWYwFLWAgkmoxazYrXP9lqOFRrfOGAEA==} - peerDependencies: - '@metaplex-foundation/umi': ^0.9.2 - - '@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 - - '@metaplex-foundation/umi-serializer-data-view@0.9.2': - resolution: {integrity: sha512-5vGptadJxUxvUcyrwFZxXlEc6Q7AYySBesizCtrBFUY8w8PnF2vzmS45CP1MLySEATNH6T9mD4Rs0tLb87iQyA==} - peerDependencies: - '@metaplex-foundation/umi': ^0.9.2 - - '@metaplex-foundation/umi-serializers-core@0.8.9': - resolution: {integrity: sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w==} - - '@metaplex-foundation/umi-serializers-encodings@0.8.9': - resolution: {integrity: sha512-N3VWLDTJ0bzzMKcJDL08U3FaqRmwlN79FyE4BHj6bbAaJ9LEHjDQ9RJijZyWqTm0jE7I750fU7Ow5EZL38Xi6Q==} - - '@metaplex-foundation/umi-serializers-numbers@0.8.9': - resolution: {integrity: sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg==} - - '@metaplex-foundation/umi-serializers@0.9.0': - resolution: {integrity: sha512-hAOW9Djl4w4ioKeR4erDZl5IG4iJdP0xA19ZomdaCbMhYAAmG/FEs5khh0uT2mq53/MnzWcXSUPoO8WBN4Q+Vg==} - - '@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 - - '@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 - - '@metaplex-foundation/umi@0.9.2': - resolution: {integrity: sha512-9i4Acm4pruQfJcpRrc2EauPBwkfDN0I9QTvJyZocIlKgoZwD6A6wH0PViH1AjOVG5CQCd1YI3tJd5XjYE1ElBw==} - - '@msgpack/msgpack@2.8.0': - resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} - engines: {node: '>= 10'} - - '@msgpack/msgpack@3.0.0-beta2': - resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} - engines: {node: '>= 14'} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/curves@1.7.0': - resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@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} - - '@noble/hashes@1.6.1': - resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} - engines: {node: ^14.21.3 || >=16} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@onsol/tldparser@0.6.7': - resolution: {integrity: sha512-QwkRDLyC514pxeplCCXZ2kTiRcJSeUrpp+9o2XqLbePy/qzZGGG8I0UbXUKuWVD/bUL1zAm21+D+Eu30OKwcQg==} - engines: {node: '>=14'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - bn.js: ^5.2.1 - borsh: ^0.7.0 - buffer: 6.0.1 - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@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 - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@pythnetwork/price-service-client@1.9.0': - resolution: {integrity: sha512-SLm3IFcfmy9iMqHeT4Ih6qMNZhJEefY14T9yTlpsH2D/FE5+BaGGnfcexUifVlfH6M7mwRC4hEFdNvZ6ebZjJg==} - deprecated: This package is deprecated and is no longer maintained. Please use @pythnetwork/hermes-client instead. - - '@pythnetwork/price-service-sdk@1.8.0': - resolution: {integrity: sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==} - - '@raydium-io/raydium-sdk-v2@0.1.95-alpha': - resolution: {integrity: sha512-+u7yxo/R1JDysTCzOuAlh90ioBe2DlM2Hbcz/tFsxP/YzmnYQzShvNjcmc0361a4zJhmlrEJfpFXW0J3kkX5vA==} - - '@saberhq/option-utils@1.15.0': - resolution: {integrity: sha512-XVbS9H4b8PIGXJGaErkOurxV2FKFyvMwYq0pD8Y1iEPoi6HB//+HnpEKAv8tCssIQ5Nn1zQWzmQ9CmGkrwzcsw==} - - '@saberhq/solana-contrib@1.15.0': - resolution: {integrity: sha512-OExL5qGrNMmIKINU7qFUDmY7+xIwVM2s360g99k8CRNHSnjpnqIzwDjr2CnvEFpeQPp22OdGlS63woDp0w0JsQ==} - peerDependencies: - '@solana/web3.js': ^1.42 - bn.js: ^4 || ^5 - - '@scure/base@1.1.9': - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - - '@scure/base@1.2.1': - resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - - '@scure/bip32@1.4.0': - resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - - '@scure/bip39@1.3.0': - resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - - '@shikijs/core@1.24.4': - resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} - - '@shikijs/engine-javascript@1.24.4': - resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} - - '@shikijs/engine-oniguruma@1.24.4': - resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} - - '@shikijs/types@1.24.4': - resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} - - '@shikijs/vscode-textmate@9.3.1': - resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@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' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@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' - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@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' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@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' - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@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' - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@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' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@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' - - '@solana/spl-account-compression@0.1.10': - resolution: {integrity: sha512-IQAOJrVOUo6LCgeWW9lHuXo6JDbi4g3/RkQtvY0SyalvSWk9BIkHHe4IkAzaQw8q/BxEVBIjz8e9bNYWIAESNw==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.50.1 - - '@solana/spl-token-group@0.0.4': - resolution: {integrity: sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@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 - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.1.8': - resolution: {integrity: sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==} - engines: {node: '>= 10'} - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-token@0.4.6': - resolution: {integrity: sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@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 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.95.3': - resolution: {integrity: sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==} - - '@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==} - - '@tensor-hq/tensor-common@8.3.1': - resolution: {integrity: sha512-cgc+Z0nR23pi+1DfJgF1+afWd+xf1e6VYPM9yhECshmERr6BgojQfcuoltHHcgpwSlLrZXnm47kQ48I2M6rxFQ==} - - '@tensor-oss/tensorswap-sdk@4.5.0': - resolution: {integrity: sha512-eNM6k1DT5V/GadxSHm8//z2wlLl8/EcA0KFQXKaxRba/2MirNySsoVGxDXO2UdOI4eZMse8f+8Et3P63WWjsIw==} - - '@tiplink/api@0.3.1': - resolution: {integrity: sha512-HjnXethjKOHTYT0IP1BewlMS7wZJ+hsoDgRa6jA1cNvxvwQjE1WHOyvOUPpAi+DJDw4P4/omFtyHr7dwLfnB/g==} - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@5.0.1': - resolution: {integrity: sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/node-fetch@2.6.12': - resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@18.19.68': - resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} - - '@types/node@22.10.2': - resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} - - '@types/promise-retry@1.1.6': - resolution: {integrity: sha512-EC1+OMXV0PZb0pf+cmyxc43MEP2CDumZe4AfuxWboxxEixztIebknpJPZAX5XlodGF1OY+C1E/RAeNGzxf+bJA==} - - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - - '@types/retry@0.12.5': - resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.13': - resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} - - '@typescript-eslint/eslint-plugin@8.18.2': - resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/parser@8.18.2': - resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/scope-manager@8.18.2': - resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@8.18.2': - resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/types@8.18.2': - resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.18.2': - resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/utils@8.18.2': - resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/visitor-keys@8.18.2': - resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.2.1': - resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ai@4.0.22: - resolution: {integrity: sha512-yvcjWtofI2HZwgT3jMkoNnDUhAY+S9cOvZ6xbbOzrS0ZeFl1/gcbasFnwAqUJ7uL/t72/3a0Vy/pKg6N19A2Mw==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.0.0 - peerDependenciesMeta: - react: - optional: true - zod: - optional: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axios-retry@3.9.1: - resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} - - axios@0.28.1: - resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==} - - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.10: - resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base-x@5.0.0: - resolution: {integrity: sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - - big.js@6.2.2: - resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bintrees@1.0.2: - resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - - bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@1.0.0: - resolution: {integrity: sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} - engines: {node: '>=12'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - crypto-hash@1.3.0: - resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} - engines: {node: '>=8'} - - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - ethereum-bloom-filters@1.2.0: - resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} - - ethereum-cryptography@2.2.1: - resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - - ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eventsource-parser@3.0.0: - resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} - engines: {node: '>=18.0.0'} - - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-process@1.4.8: - resolution: {integrity: sha512-W2PIdgXfhYeIlTzGiDyGJhjslZcwQCRcSw6plgyLu3CFk1PhQrKkTbQ5jkJ2NhOabMwETTrhl7c+xBcQ7B2jRg==} - hasBin: true - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - - form-data-encoder@1.7.2: - resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - - formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} - engines: {node: 20 || >=22} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - graphemesplit@2.4.4: - resolution: {integrity: sha512-lKrpp1mk1NH26USxC/Asw4OHbhSQf5XfrWZ+CDv/dFVvd1j17kFgMotdJvOesmHkbFX9P9sBfpH8VogxOWLg8w==} - - groq-sdk@0.5.0: - resolution: {integrity: sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-retry-allowed@2.2.0: - resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} - engines: {node: '>=10'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.0.2: - resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} - engines: {node: 20 || >=22} - - jayson@4.1.3: - resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} - engines: {node: '>=8'} - hasBin: true - - js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - - js-sha256@0.11.0: - resolution: {integrity: sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==} - - js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - js-tiktoken@1.0.16: - resolution: {integrity: sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsondiffpatch@0.6.0: - resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - - keccak256@1.0.6: - resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} - - keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - langchain@0.3.8: - resolution: {integrity: sha512-EiAHFgBdThuXFmIx9j81wjdPItpRsw0Ck4r5dyhB74gyhehRGna/UK2CTqeKVnIUM/f4g4JbxUgAU4voXljDMw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/anthropic': '*' - '@langchain/aws': '*' - '@langchain/cohere': '*' - '@langchain/core': '>=0.2.21 <0.4.0' - '@langchain/google-genai': '*' - '@langchain/google-vertexai': '*' - '@langchain/groq': '*' - '@langchain/mistralai': '*' - '@langchain/ollama': '*' - axios: '*' - cheerio: '*' - handlebars: ^4.7.8 - peggy: ^3.0.2 - typeorm: '*' - peerDependenciesMeta: - '@langchain/anthropic': - optional: true - '@langchain/aws': - optional: true - '@langchain/cohere': - optional: true - '@langchain/google-genai': - optional: true - '@langchain/google-vertexai': - optional: true - '@langchain/groq': - optional: true - '@langchain/mistralai': - optional: true - '@langchain/ollama': - optional: true - axios: - optional: true - cheerio: - optional: true - handlebars: - optional: true - peggy: - optional: true - typeorm: - optional: true - - langsmith@0.2.14: - resolution: {integrity: sha512-ClAuAgSf3m9miMYotLEaZKQyKdaWlfjhebCuYco8bc6g72dU2VwTg31Bv4YINBq7EH2i1cMwbOiJxbOXPqjGig==} - peerDependencies: - openai: '*' - peerDependenciesMeta: - openai: - optional: true - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - libsodium-sumo@0.7.15: - resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} - - libsodium-wrappers-sumo@0.7.15: - resolution: {integrity: sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==} - - libsodium-wrappers@0.7.15: - resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==} - - libsodium@0.7.15: - resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==} - - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} - engines: {node: 20 || >=22} - - lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true - - math-expression-evaluator@2.0.6: - resolution: {integrity: sha512-DRung1qNcKbgkhFeQ0fBPUFB6voRUMY7KyRyp1TRQ2v95Rp2egC823xLRooM1mDx1rmbkY7ym6ZWmpaE/VimOA==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} - engines: {node: '>= 7.6.0'} - - micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - oniguruma-to-es@0.8.1: - resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} - - openai@4.77.0: - resolution: {integrity: sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==} - hasBin: true - peerDependencies: - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - - openapi-types@12.1.3: - resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - - percentile@1.6.0: - resolution: {integrity: sha512-8vSyjdzwxGDHHwH+cSGch3A9Uj2On3UpgOWxWXMKwUvoAbnujx6DaqmV1duWXNiH/oEWpyVd6nSQccix6DM3Ng==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - poly1305-js@0.4.4: - resolution: {integrity: sha512-5B6/S+vg5AOr66wJDkh5LOpU/F3EKANDy4VXKsNZLXea1uCy6CiOWOZ3VhcC0nYdhE7vJUMcLxqcVlrv2g/+Rg==} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} - engines: {node: '>=14'} - hasBin: true - - prom-client@15.1.3: - resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} - engines: {node: ^16 || ^18 || >=20} - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regex-recursion@5.1.1: - resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true - - rpc-websockets@9.0.4: - resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - semaphore@1.1.0: - resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} - engines: {node: '>=0.8.0'} - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shiki@1.24.4: - resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - - sodium-native@3.4.1: - resolution: {integrity: sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ==} - - sodium-plus@0.9.0: - resolution: {integrity: sha512-WWKxrd81qDL7C1A10yxNmZ135yovEZuIRnZ/BIf/FcajYBupbKbPdgzwlusPHLVxkMDDamcarq9PxxRBUSqpCw==} - peerDependencies: - sodium-native: ^3.2.0 - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - spok@1.5.5: - resolution: {integrity: sha512-IrJIXY54sCNFASyHPOY+jEirkiJ26JDqsGiI0Dvhwcnkl0PEWi1PSsrkYql0rzDw8LFVTcA7rdUCAJdE2HE+2Q==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - 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'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - swr@2.3.0: - resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} - - tdigest@0.1.2: - resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - throttleit@2.1.0: - resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} - engines: {node: '>=18'} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toformat@2.0.0: - resolution: {integrity: sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-log@2.2.7: - resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - 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-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - 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 - - typedoc@0.27.6: - resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} - engines: {node: '>= 18'} - hasBin: true - peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x - - typescript-collections@1.3.3: - resolution: {integrity: sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ==} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - 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'} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - use-sync-external-store@1.4.0: - resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - 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'} - - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - 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 - - xsalsa20@1.2.0: - resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} - - 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'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - 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==} - - zstddec@0.0.2: - resolution: {integrity: sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA==} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@ai-sdk/openai@1.0.11(zod@3.24.1)': - dependencies: - '@ai-sdk/provider': 1.0.3 - '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) - zod: 3.24.1 - - '@ai-sdk/provider-utils@2.0.5(zod@3.24.1)': - dependencies: - '@ai-sdk/provider': 1.0.3 - eventsource-parser: 3.0.0 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - optionalDependencies: - zod: 3.24.1 - - '@ai-sdk/provider@1.0.3': - dependencies: - json-schema: 0.4.0 - - '@ai-sdk/react@1.0.7(react@19.0.0)(zod@3.24.1)': - dependencies: - '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) - '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) - swr: 2.3.0(react@19.0.0) - throttleit: 2.1.0 - optionalDependencies: - react: 19.0.0 - zod: 3.24.1 - - '@ai-sdk/ui-utils@1.0.6(zod@3.24.1)': - dependencies: - '@ai-sdk/provider': 1.0.3 - '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) - zod-to-json-schema: 3.24.1(zod@3.24.1) - optionalDependencies: - zod: 3.24.1 - - '@babel/runtime@7.26.0': dependencies: '@solana/web3.js': 1.98.0 borsh: 1.0.0 @@ -2670,7 +247,7 @@ snapshots: '@solana/web3.js': ^1.87.3 dependencies: '@bonfida/sns-records': 0.0.1(@solana/web3.js@1.98.0) - '@noble/curves': 1.7.0 + '@noble/curves': 1.8.0 '@scure/base': 1.2.1 '@solana/spl-token': 0.4.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) '@solana/web3.js': 1.98.0 @@ -2720,6 +297,11 @@ snapshots: - utf-8-validate dev: false + /@coral-xyz/anchor-errors@0.30.1: + resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==} + engines: {node: '>=10'} + dev: false + /@coral-xyz/anchor@0.26.0: resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==} engines: {node: '>=11'} @@ -2750,7 +332,32 @@ snapshots: engines: {node: '>=11'} dependencies: '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.0) - '@noble/hashes': 1.6.1 + '@noble/hashes': 1.7.0 + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + 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 + dev: false + + /@coral-xyz/anchor@0.30.1: + resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==} + engines: {node: '>=11'} + dependencies: + '@coral-xyz/anchor-errors': 0.30.1 + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.0) + '@noble/hashes': 1.7.0 '@solana/web3.js': 1.98.0 bn.js: 5.2.1 bs58: 4.0.1 @@ -2791,6 +398,17 @@ snapshots: buffer-layout: 1.2.2 dev: false + /@coral-xyz/borsh@0.30.1(@solana/web3.js@1.98.0): + resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + dependencies: + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + buffer-layout: 1.2.2 + dev: false + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2798,13 +416,13 @@ snapshots: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@eslint-community/eslint-utils@4.4.1(eslint@8.56.0): + /@eslint-community/eslint-utils@4.4.1(eslint@8.57.1): resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 + eslint: 8.57.1 eslint-visitor-keys: 3.4.3 dev: true @@ -2874,8 +492,8 @@ snapshots: - supports-color dev: false - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + /@eslint/js@8.57.1: + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -2929,12 +547,12 @@ snapshots: hash.js: 1.1.7 dev: false - /@gerrit0/mini-shiki@1.24.4: - resolution: {integrity: sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw==} + /@gerrit0/mini-shiki@1.26.1: + resolution: {integrity: sha512-gHFUvv9f1fU2Piou/5Y7Sx5moYxcERbC7CXc6rkDLQTUBg5Dgg9L4u29/nHqfoQ3Y9R0h0BcOhd14uOEZIBP7Q==} dependencies: - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/engine-oniguruma': 1.26.1 + '@shikijs/types': 1.26.1 + '@shikijs/vscode-textmate': 10.0.1 dev: false /@humanfs/core@0.19.1: @@ -2950,8 +568,8 @@ snapshots: '@humanwhocodes/retry': 0.3.1 dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + /@humanwhocodes/config-array@0.13.0: + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead dependencies: @@ -3009,8 +627,8 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 dev: true - /@langchain/core@0.3.26(openai@4.77.0): - resolution: {integrity: sha512-6RUQHEp8wv+JwtYIIEBYBzbLlcAQZFc7EDOgAM0ukExjh9HiXoJzoWpgMRRCrr/koIbtwXPJUqBprZK1I1CXHQ==} + /@langchain/core@0.3.27(openai@4.77.3): + resolution: {integrity: sha512-jtJKbJWB1NPU1YvtrExOB2rumvUFgkJwlWGxyjSIV9A6zcLVmUbcZGV8fCSuXgl5bbzOIQLJ1xcLYQmbW9TkTg==} engines: {node: '>=18'} dependencies: '@cfworker/json-schema': 4.0.3 @@ -3018,7 +636,7 @@ snapshots: camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.16 - langsmith: 0.2.14(openai@4.77.0) + langsmith: 0.2.14(openai@4.77.3) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -3029,14 +647,14 @@ snapshots: - openai dev: false - /@langchain/groq@0.1.2(@langchain/core@0.3.26): + /@langchain/groq@0.1.2(@langchain/core@0.3.27): resolution: {integrity: sha512-bgQ9yGoNHOwG6LG2ngGvSNxF/1U1c1u3vKmFWmzecFIcBoQQOJY0jb0MrL3g1uTife0Sr3zxkWKXQg2aK/U4Sg==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' dependencies: - '@langchain/core': 0.3.26(openai@4.77.0) - '@langchain/openai': 0.3.16(@langchain/core@0.3.26) + '@langchain/core': 0.3.27(openai@4.77.3) + '@langchain/openai': 0.3.16(@langchain/core@0.3.27) groq-sdk: 0.5.0 zod: 3.24.1 zod-to-json-schema: 3.24.1(zod@3.24.1) @@ -3044,13 +662,13 @@ snapshots: - encoding dev: false - /@langchain/langgraph-checkpoint@0.0.13(@langchain/core@0.3.26): + /@langchain/langgraph-checkpoint@0.0.13(@langchain/core@0.3.27): resolution: {integrity: sha512-amdmBcNT8a9xP2VwcEWxqArng4gtRDcnVyVI4DsQIo1Aaz8e8+hH17zSwrUF3pt1pIYztngIfYnBOim31mtKMg==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.31 <0.4.0' dependencies: - '@langchain/core': 0.3.26(openai@4.77.0) + '@langchain/core': 0.3.27(openai@4.77.3) uuid: 10.0.0 dev: false @@ -3063,41 +681,41 @@ snapshots: uuid: 9.0.1 dev: false - /@langchain/langgraph@0.2.36(@langchain/core@0.3.26): - resolution: {integrity: sha512-zxk7ZCVxP0/Ut9785EiXCS7BE7sXd8cu943mcZUF2aNFUaQRTBbbiKpNdR3nb1+xO/B+HVktrJT2VFdkAywnng==} + /@langchain/langgraph@0.2.38(@langchain/core@0.3.27): + resolution: {integrity: sha512-mVy99pMftBGgUTBTCepSyzTovWCvpgdNcXsAjxTiMrMX6lzueNiBz0ljkY7UFoIoHYwurQbyl2WmMPFuxkSIAw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.36 <0.3.0 || >=0.3.9 < 0.4.0' dependencies: - '@langchain/core': 0.3.26(openai@4.77.0) - '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.26) + '@langchain/core': 0.3.27(openai@4.77.3) + '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.27) '@langchain/langgraph-sdk': 0.0.33 uuid: 10.0.0 zod: 3.24.1 dev: false - /@langchain/openai@0.3.16(@langchain/core@0.3.26): + /@langchain/openai@0.3.16(@langchain/core@0.3.27): resolution: {integrity: sha512-Om9HRlTeI0Ou6D4pfxbWHop4WGfkCdV/7v1W/+Jr7NSf0BNoA9jk5GqGms8ZtOYSGgPvizDu3i0TrM3B4cN4NA==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.26 <0.4.0' dependencies: - '@langchain/core': 0.3.26(openai@4.77.0) + '@langchain/core': 0.3.27(openai@4.77.3) js-tiktoken: 1.0.16 - openai: 4.77.0(zod@3.24.1) + openai: 4.77.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.26): + /@langchain/textsplitters@0.1.0(@langchain/core@0.3.27): resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' dependencies: - '@langchain/core': 0.3.26(openai@4.77.0) + '@langchain/core': 0.3.27(openai@4.77.3) js-tiktoken: 1.0.16 dev: false @@ -3260,7 +878,7 @@ snapshots: - utf-8-validate dev: false - /@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.1): + /@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.7.0): resolution: {integrity: sha512-h1kLw+cGaV8SiykoHDb1/G01+VYqtJXAt0uGuO5+2Towsdtc6ET4M62iqUnh4EacTVMIW1yYHsKsG/LYWBCKaA==} peerDependencies: '@metaplex-foundation/umi': '>=0.8.2 < 1' @@ -3268,7 +886,7 @@ snapshots: dependencies: '@metaplex-foundation/umi': 0.9.2 '@msgpack/msgpack': 3.0.0-beta2 - '@noble/hashes': 1.6.1 + '@noble/hashes': 1.7.0 dev: false /@metaplex-foundation/mpl-token-metadata@2.13.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): @@ -3376,7 +994,7 @@ snapshots: 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) - '@noble/curves': 1.7.0 + '@noble/curves': 1.8.0 '@solana/web3.js': 1.98.0 dev: false @@ -3386,7 +1004,7 @@ snapshots: '@metaplex-foundation/umi': ^0.9.2 dependencies: '@metaplex-foundation/umi': 0.9.2 - node-fetch: 2.7.0 + node-fetch: 2.6.12 transitivePeerDependencies: - encoding dev: false @@ -3508,11 +1126,11 @@ snapshots: '@noble/hashes': 1.4.0 dev: false - /@noble/curves@1.7.0: - resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + /@noble/curves@1.8.0: + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} engines: {node: ^14.21.3 || >=16} dependencies: - '@noble/hashes': 1.6.0 + '@noble/hashes': 1.7.0 dev: false /@noble/hashes@1.4.0: @@ -3525,13 +1143,8 @@ snapshots: engines: {node: ^14.21.3 || >=16} dev: false - /@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: - resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + /@noble/hashes@1.7.0: + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} engines: {node: ^14.21.3 || >=16} dev: false @@ -3596,8 +1209,8 @@ snapshots: tiny-invariant: 1.3.3 dev: false - /@orca-so/whirlpools-sdk@0.13.12(@coral-xyz/anchor@0.29.0)(@orca-so/common-sdk@0.6.4)(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3): - resolution: {integrity: sha512-+LOqGTe0DYUsYwemltOU4WQIviqoICQlIcAmmEX/WnBh6wntpcLDcXkPV6dBHW7NA2/J8WEVAZ50biLJb4subg==} + /@orca-so/whirlpools-sdk@0.13.13(@coral-xyz/anchor@0.29.0)(@orca-so/common-sdk@0.6.4)(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3): + resolution: {integrity: sha512-S3ovmnihBdZ5cmn3ylvJv+kAIUcGX5Y5RSWzv/WvF6etv/tLuO8FKc5mYxVenTa/NG78turTMbhujDdfGaahDw==} peerDependencies: '@coral-xyz/anchor': ~0.29.0 '@orca-so/common-sdk': 0.6.4 @@ -3719,41 +1332,53 @@ snapshots: '@scure/base': 1.1.9 dev: false - /@shikijs/core@1.24.4: - resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} + /@shikijs/core@1.26.1: + resolution: {integrity: sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA==} dependencies: - '@shikijs/engine-javascript': 1.24.4 - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/engine-javascript': 1.26.1 + '@shikijs/engine-oniguruma': 1.26.1 + '@shikijs/types': 1.26.1 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 dev: false - /@shikijs/engine-javascript@1.24.4: - resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} + /@shikijs/engine-javascript@1.26.1: + resolution: {integrity: sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw==} dependencies: - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.8.1 + '@shikijs/types': 1.26.1 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 0.10.0 dev: false - /@shikijs/engine-oniguruma@1.24.4: - resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} + /@shikijs/engine-oniguruma@1.26.1: + resolution: {integrity: sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg==} dependencies: - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 1.26.1 + '@shikijs/vscode-textmate': 10.0.1 dev: false - /@shikijs/types@1.24.4: - resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} + /@shikijs/langs@1.26.1: + resolution: {integrity: sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw==} dependencies: - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 1.26.1 + dev: false + + /@shikijs/themes@1.26.1: + resolution: {integrity: sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA==} + dependencies: + '@shikijs/types': 1.26.1 + dev: false + + /@shikijs/types@1.26.1: + resolution: {integrity: sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q==} + dependencies: + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 dev: false - /@shikijs/vscode-textmate@9.3.1: - resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + /@shikijs/vscode-textmate@10.0.1: + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} dev: false /@solana/buffer-layout-utils@0.2.0: @@ -4312,8 +1937,8 @@ snapshots: resolution: {integrity: sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==} dependencies: '@babel/runtime': 7.26.0 - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.1 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 @@ -4336,8 +1961,8 @@ snapshots: resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} dependencies: '@babel/runtime': 7.26.0 - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.1 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 @@ -4457,7 +2082,7 @@ snapshots: /@types/bn.js@5.1.6: resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 /@types/chai@5.0.1: resolution: {integrity: sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA==} @@ -4468,12 +2093,16 @@ snapshots: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 dev: false - '@types/deep-eql@4.0.2': {} + /@types/deep-eql@4.0.2: + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + dev: true - '@types/diff-match-patch@1.0.36': {} + /@types/diff-match-patch@1.0.36: + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + dev: false /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -4498,7 +2127,7 @@ snapshots: /@types/node-fetch@2.6.12: resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 form-data: 4.0.1 dev: false @@ -4512,8 +2141,8 @@ snapshots: undici-types: 5.26.5 dev: false - /@types/node@22.10.2: - resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + /@types/node@22.10.5: + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} dependencies: undici-types: 6.20.0 @@ -4546,17 +2175,17 @@ snapshots: /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 dev: false /@types/ws@8.5.13: resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 dev: false - /@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2)(eslint@8.56.0)(typescript@5.7.2): - resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} + /@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0)(eslint@8.57.1)(typescript@5.7.2): + resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -4564,12 +2193,12 @@ snapshots: typescript: '>=4.8.4 <5.8.0' dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.2(eslint@8.56.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.2 - '@typescript-eslint/type-utils': 8.18.2(eslint@8.56.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.2(eslint@8.56.0)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.2 - eslint: 8.56.0 + '@typescript-eslint/parser': 8.19.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/type-utils': 8.19.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.19.0 + eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -4579,62 +2208,62 @@ snapshots: - supports-color dev: true - /@typescript-eslint/parser@8.18.2(eslint@8.56.0)(typescript@5.7.2): - resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} + /@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2): + resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' dependencies: - '@typescript-eslint/scope-manager': 8.18.2 - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.19.0 debug: 4.4.0 - eslint: 8.56.0 + eslint: 8.57.1 typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@8.18.2: - resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} + /@typescript-eslint/scope-manager@8.19.0: + resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 dev: true - /@typescript-eslint/type-utils@8.18.2(eslint@8.56.0)(typescript@5.7.2): - resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} + /@typescript-eslint/type-utils@8.19.0(eslint@8.57.1)(typescript@5.7.2): + resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' dependencies: - '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.2(eslint@8.56.0)(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@8.57.1)(typescript@5.7.2) debug: 4.4.0 - eslint: 8.56.0 + eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@8.18.2: - resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} + /@typescript-eslint/types@8.19.0: + resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2): - resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} + /@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2): + resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' dependencies: - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -4646,34 +2275,48 @@ snapshots: - supports-color dev: true - /@typescript-eslint/utils@8.18.2(eslint@8.56.0)(typescript@5.7.2): - resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} + /@typescript-eslint/utils@8.19.0(eslint@8.57.1)(typescript@5.7.2): + resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.56.0) - '@typescript-eslint/scope-manager': 8.18.2 - '@typescript-eslint/types': 8.18.2 - '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) - eslint: 8.56.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + eslint: 8.57.1 typescript: 5.7.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys@8.18.2: - resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} + /@typescript-eslint/visitor-keys@8.19.0: + resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/types': 8.19.0 eslint-visitor-keys: 4.2.0 dev: true /@ungap/structured-clone@1.2.1: resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + /@voltr/sdk@0.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-iLb0zc3ClZYJ9DBgMeuONSnZKa8r54MGj2LfN+4ZXXDx/O+ssjuuFPE+tcmWU0tL0yfHOLRgwWEPc4yynWG3Rg==} + dependencies: + '@coral-xyz/anchor': 0.30.1 + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -4715,7 +2358,17 @@ snapshots: humanize-ms: 1.2.1 dev: false - ai@4.0.22(react@19.0.0)(zod@3.24.1): + /ai@4.0.25(react@19.0.0)(zod@3.24.1): + resolution: {integrity: sha512-gGmx5Yun0OZA4NAeg5nX+m1n3Z3ZEmB2By3R3eOfDdOaTYxE6xq+wwKpY4KsuQCd/XeabKRy+aHPrEe/vI9FWQ==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true dependencies: '@ai-sdk/provider': 1.0.3 '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) @@ -4723,12 +2376,13 @@ snapshots: '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 - zod-to-json-schema: 3.24.1(zod@3.24.1) - optionalDependencies: react: 19.0.0 zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + dev: false - ajv@6.12.6: + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -4988,7 +2642,7 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 dev: false @@ -4997,7 +2651,7 @@ snapshots: engines: {node: '>= 0.4'} dependencies: call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 dev: false /callsites@3.1.0: @@ -5190,9 +2844,14 @@ snapshots: dequal: 2.0.3 dev: false - diff-match-patch@1.0.5: {} + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: false - diff@4.0.2: {} + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} @@ -5283,16 +2942,16 @@ snapshots: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier@9.1.0(eslint@8.56.0): + /eslint-config-prettier@9.1.0(eslint@8.57.1): resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.56.0 + eslint: 8.57.1 dev: true - /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.4.2): + /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.1)(prettier@3.4.2): resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -5306,8 +2965,8 @@ snapshots: eslint-config-prettier: optional: true dependencies: - eslint: 8.56.0 - eslint-config-prettier: 9.1.0(eslint@8.56.0) + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) prettier: 3.4.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 @@ -5337,17 +2996,17 @@ snapshots: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + /eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.1 @@ -5474,7 +3133,7 @@ snapshots: /ethereum-bloom-filters@1.2.0: resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} dependencies: - '@noble/hashes': 1.6.1 + '@noble/hashes': 1.7.0 dev: false /ethereum-cryptography@2.2.1: @@ -5503,9 +3162,14 @@ snapshots: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false - eventemitter3@5.0.1: {} + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false - eventsource-parser@3.0.0: {} + /eventsource-parser@3.0.0: + resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} + engines: {node: '>=18.0.0'} + dev: false /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -5675,22 +3339,30 @@ snapshots: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: false - /get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + /get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} dependencies: call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 function-bind: 1.1.2 + get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 math-intrinsics: 1.1.0 dev: false + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5784,7 +3456,7 @@ snapshots: agentkeepalive: 4.6.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 - node-fetch: 2.7.0 + node-fetch: 2.6.12 web-streams-polyfill: 3.3.3 transitivePeerDependencies: - encoding @@ -5915,11 +3587,14 @@ snapshots: engines: {node: '>=8'} dev: false - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 dev: false /is-glob@4.0.3: @@ -5951,6 +3626,16 @@ snapshots: engines: {node: '>=8'} dev: true + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: false + /is-retry-allowed@2.2.0: resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} engines: {node: '>=10'} @@ -6054,24 +3739,38 @@ snapshots: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema@0.4.0: {} + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - 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 - jsondiffpatch@0.6.0: + /jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true dependencies: '@types/diff-match-patch': 1.0.36 chalk: 5.4.1 diff-match-patch: 1.0.5 + dev: false - jsonfile@6.1.0: + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.1 optionalDependencies: @@ -6111,12 +3810,13 @@ snapshots: dependencies: json-buffer: 3.0.1 - /langchain@0.3.8(@langchain/core@0.3.26)(@langchain/groq@0.1.2)(openai@4.77.0): - resolution: {integrity: sha512-EiAHFgBdThuXFmIx9j81wjdPItpRsw0Ck4r5dyhB74gyhehRGna/UK2CTqeKVnIUM/f4g4JbxUgAU4voXljDMw==} + /langchain@0.3.9(@langchain/core@0.3.27)(@langchain/groq@0.1.2)(openai@4.77.3): + resolution: {integrity: sha512-uteRutI03Bt9f53nZmx8mWfJXkf6VlFVRuOprRJ0mWdCpkTP359sxrH4v6w4TokLiziPC/aMay662kmOz0dHlA==} engines: {node: '>=18'} peerDependencies: '@langchain/anthropic': '*' '@langchain/aws': '*' + '@langchain/cerebras': '*' '@langchain/cohere': '*' '@langchain/core': '>=0.2.21 <0.4.0' '@langchain/google-genai': '*' @@ -6134,6 +3834,8 @@ snapshots: optional: true '@langchain/aws': optional: true + '@langchain/cerebras': + optional: true '@langchain/cohere': optional: true '@langchain/google-genai': @@ -6157,14 +3859,14 @@ snapshots: typeorm: optional: true dependencies: - '@langchain/core': 0.3.26(openai@4.77.0) - '@langchain/groq': 0.1.2(@langchain/core@0.3.26) - '@langchain/openai': 0.3.16(@langchain/core@0.3.26) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.26) + '@langchain/core': 0.3.27(openai@4.77.3) + '@langchain/groq': 0.1.2(@langchain/core@0.3.27) + '@langchain/openai': 0.3.16(@langchain/core@0.3.27) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.27) js-tiktoken: 1.0.16 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.2.14(openai@4.77.0) + langsmith: 0.2.14(openai@4.77.3) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 @@ -6176,7 +3878,7 @@ snapshots: - openai dev: false - /langsmith@0.2.14(openai@4.77.0): + /langsmith@0.2.14(openai@4.77.3): resolution: {integrity: sha512-ClAuAgSf3m9miMYotLEaZKQyKdaWlfjhebCuYco8bc6g72dU2VwTg31Bv4YINBq7EH2i1cMwbOiJxbOXPqjGig==} peerDependencies: openai: '*' @@ -6186,7 +3888,7 @@ snapshots: dependencies: '@types/uuid': 10.0.0 commander: 10.0.1 - openai: 4.77.0(zod@3.24.1) + openai: 4.77.3(zod@3.24.1) p-queue: 6.6.2 p-retry: 4.6.2 semver: 7.6.3 @@ -6441,6 +4143,18 @@ snapshots: engines: {node: '>=10.5.0'} dev: false + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -6497,16 +4211,16 @@ snapshots: wrappy: 1.0.2 dev: true - /oniguruma-to-es@0.8.1: - resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} + /oniguruma-to-es@0.10.0: + resolution: {integrity: sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==} dependencies: emoji-regex-xs: 1.0.0 regex: 5.1.1 regex-recursion: 5.1.1 dev: false - /openai@4.77.0(zod@3.24.1): - resolution: {integrity: sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==} + /openai@4.77.3(zod@3.24.1): + resolution: {integrity: sha512-wLDy4+KWHz31HRFMW2+9KQuVuT2QWhs0z94w1Gm1h2Ut9vIHr9/rHZggbykZEfyiaJRVgw8ZS9K6AylDWzvPYw==} hasBin: true peerDependencies: zod: ^3.23.8 @@ -6520,7 +4234,7 @@ snapshots: agentkeepalive: 4.6.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 - node-fetch: 2.7.0 + node-fetch: 2.6.12 zod: 3.24.1 transitivePeerDependencies: - encoding @@ -6719,9 +4433,14 @@ snapshots: safe-buffer: 5.2.1 dev: false - react@19.0.0: {} + /react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + dev: false - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 @@ -6813,9 +4532,22 @@ snapshots: queue-microtask: 1.2.3 dev: true - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false - secure-json-parse@2.7.0: {} + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: false + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false /semaphore@1.1.0: resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} @@ -6834,7 +4566,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 dev: false @@ -6849,14 +4581,16 @@ snapshots: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shiki@1.24.4: - resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} + /shiki@1.26.1: + resolution: {integrity: sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw==} dependencies: - '@shikijs/core': 1.24.4 - '@shikijs/engine-javascript': 1.24.4 - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/core': 1.26.1 + '@shikijs/engine-javascript': 1.26.1 + '@shikijs/engine-oniguruma': 1.26.1 + '@shikijs/langs': 1.26.1 + '@shikijs/themes': 1.26.1 + '@shikijs/types': 1.26.1 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 dev: false @@ -6981,13 +4715,19 @@ snapshots: dependencies: has-flag: 4.0.0 - swr@2.3.0(react@19.0.0): + /swr@2.3.0(react@19.0.0): + resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 dependencies: dequal: 2.0.3 react: 19.0.0 use-sync-external-store: 1.4.0(react@19.0.0) + dev: false - synckit@0.9.2: + /synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.1 tslib: 2.8.1 @@ -7003,9 +4743,13 @@ snapshots: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} dev: false - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - throttleit@2.1.0: {} + /throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + dev: false /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -7060,7 +4804,7 @@ snapshots: resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} dev: false - /ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): + /ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.2): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -7079,7 +4823,7 @@ snapshots: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.10.2 + '@types/node': 22.10.5 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -7138,7 +4882,7 @@ snapshots: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.24.4 + shiki: 1.26.1 typescript: 5.7.2 yaml: 2.7.0 dev: false @@ -7150,7 +4894,7 @@ snapshots: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x dependencies: - '@gerrit0/mini-shiki': 1.24.4 + '@gerrit0/mini-shiki': 1.26.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 @@ -7234,11 +4978,18 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.4.0(react@19.0.0): + /use-sync-external-store@1.4.0(react@19.0.0): + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 dependencies: react: 19.0.0 + dev: false - utf-8-validate@5.0.10: + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true dependencies: node-gyp-build: 4.8.4 dev: false @@ -7256,7 +5007,7 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.2.0 - is-generator-function: 1.0.10 + is-generator-function: 1.1.0 is-typed-array: 1.1.15 which-typed-array: 1.1.18 dev: false @@ -7441,3 +5192,4201 @@ snapshots: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false + +snapshots: + '@ai-sdk/openai@1.0.11(zod@3.24.1)': + dependencies: + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + zod: 3.24.1 + '@ai-sdk/provider-utils@2.0.5(zod@3.24.1)': + dependencies: + '@ai-sdk/provider': 1.0.3 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.24.1 + '@ai-sdk/provider@1.0.3': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/react@1.0.7(react@19.0.0)(zod@3.24.1)': + dependencies: + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) + swr: 2.3.0(react@19.0.0) + throttleit: 2.1.0 + optionalDependencies: + react: 19.0.0 + zod: 3.24.1 + '@ai-sdk/ui-utils@1.0.6(zod@3.24.1)': + dependencies: + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + zod-to-json-schema: 3.24.1(zod@3.24.1) + optionalDependencies: + zod: 3.24.1 + '@babel/runtime@7.26.0': + dependencies: + '@solana/web3.js': 1.98.0 + 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.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + 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.98.0) + '@noble/curves': 1.7.0 + '@scure/base': 1.2.1 + '@solana/spl-token': 0.4.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + 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: + resolution: {integrity: sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==} + dev: false + /@cks-systems/manifest-sdk@0.1.73(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-IcRM7k3YZ/jK5nJwE3xGp2Xg7Um4/XCeqrLs5yB3+IjS7W089Qs/prJXdRGKbFwCLkMt9ds6pElHufQr8an0Iw==} + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/rustbin': 0.3.5 + '@metaplex-foundation/solita': 0.12.2 + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 6.0.0 + js-sha256: 0.11.0 + keccak256: 1.0.6 + percentile: 1.6.0 + prom-client: 15.1.3 + rimraf: 5.0.10 + typedoc: 0.26.11(typescript@5.7.2) + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + zstddec: 0.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - jiti + - supports-color + - typescript + - utf-8-validate + dev: false + /@coral-xyz/anchor@0.26.0: + resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==} + engines: {node: '>=11'} + dependencies: + '@coral-xyz/borsh': 0.26.0(@solana/web3.js@1.98.0) + '@solana/web3.js': 1.98.0 + base64-js: 1.5.1 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + js-sha256: 0.9.0 + pako: 2.1.0 + snake-case: 3.0.4 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@coral-xyz/anchor@0.29.0: + resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} + engines: {node: '>=11'} + dependencies: + '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.0) + '@noble/hashes': 1.6.1 + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + 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 + dev: false + /@coral-xyz/borsh@0.26.0(@solana/web3.js@1.98.0): + resolution: {integrity: sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + dependencies: + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + buffer-layout: 1.2.2 + dev: false + /@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.0): + resolution: {integrity: sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + dependencies: + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + buffer-layout: 1.2.2 + dev: false + /@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 + /@eslint-community/eslint-utils@4.4.1(eslint@8.56.0): + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@eslint-community/eslint-utils@4.4.1(eslint@9.17.0): + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.17.0 + eslint-visitor-keys: 3.4.3 + dev: false + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@eslint/config-array@0.19.1: + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.5 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@eslint/core@0.9.1: + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@types/json-schema': 7.0.15 + dev: false + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/eslintrc@3.2.0: + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@eslint/js@9.17.0: + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: false + /@eslint/object-schema@2.1.5: + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: false + /@eslint/plugin-kit@0.2.4: + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + levn: 0.4.1 + dev: false + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: false + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + dev: false + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: false + /@gerrit0/mini-shiki@1.24.4: + resolution: {integrity: sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw==} + dependencies: + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + dev: false + /@humanfs/core@0.19.1: + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + dev: false + /@humanfs/node@0.16.6: + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + dev: false + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + dev: true + /@humanwhocodes/retry@0.3.1: + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + dev: false + /@humanwhocodes/retry@0.4.1: + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@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: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@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.26(openai@4.77.0): + 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.16 + langsmith: 0.2.14(openai@4.77.0) + 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.26): + resolution: {integrity: sha512-bgQ9yGoNHOwG6LG2ngGvSNxF/1U1c1u3vKmFWmzecFIcBoQQOJY0jb0MrL3g1uTife0Sr3zxkWKXQg2aK/U4Sg==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0) + '@langchain/openai': 0.3.16(@langchain/core@0.3.26) + 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.26): + resolution: {integrity: sha512-amdmBcNT8a9xP2VwcEWxqArng4gtRDcnVyVI4DsQIo1Aaz8e8+hH17zSwrUF3pt1pIYztngIfYnBOim31mtKMg==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.31 <0.4.0' + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0) + uuid: 10.0.0 + dev: false + /@langchain/langgraph-sdk@0.0.33: + resolution: {integrity: sha512-l/hRbI6roLzplBXy2VyDUwqY1TkK7RcjPmrMUuVdvCCH4LTwLfIXh/G1kHatNiN7VUTskw0FkfBbgq6gtj0ang==} + 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.36(@langchain/core@0.3.26): + resolution: {integrity: sha512-zxk7ZCVxP0/Ut9785EiXCS7BE7sXd8cu943mcZUF2aNFUaQRTBbbiKpNdR3nb1+xO/B+HVktrJT2VFdkAywnng==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.36 <0.3.0 || >=0.3.9 < 0.4.0' + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0) + '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.26) + '@langchain/langgraph-sdk': 0.0.33 + uuid: 10.0.0 + zod: 3.24.1 + dev: false + /@langchain/openai@0.3.16(@langchain/core@0.3.26): + resolution: {integrity: sha512-Om9HRlTeI0Ou6D4pfxbWHop4WGfkCdV/7v1W/+Jr7NSf0BNoA9jk5GqGms8ZtOYSGgPvizDu3i0TrM3B4cN4NA==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.26 <0.4.0' + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0) + 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 + dev: false + /@langchain/textsplitters@0.1.0(@langchain/core@0.3.26): + resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.21 <0.4.0' + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0) + js-tiktoken: 1.0.16 + dev: false + /@lightprotocol/compressed-token@0.17.1(@lightprotocol/stateless.js@0.17.1)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-493KCmZGw1BcHVRJaeRm8EEs+L7gX8dwY7JG13w2pfgOMtZXZ7Wxt261jFJxQJzRLTrUSlrbRJOmfW1+S1Y8SQ==} + peerDependencies: + '@lightprotocol/stateless.js': 0.17.1 + dependencies: + '@coral-xyz/anchor': 0.29.0 + '@lightprotocol/stateless.js': 0.17.1 + '@solana/spl-token': 0.4.8(@solana/web3.js@1.95.3)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.3 + buffer: 6.0.3 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /@lightprotocol/stateless.js@0.17.1: + resolution: {integrity: sha512-EjId1n33A6dBwpce33Wsa/fs/CDKtMtRrkxbApH0alXrnEXmbW6QhIViXOrKYXjZ4uJQM1xsBtsKe0vqJ4nbtQ==} + dependencies: + '@coral-xyz/anchor': 0.29.0 + '@noble/hashes': 1.5.0 + '@solana/web3.js': 1.95.3 + buffer: 6.0.3 + superstruct: 2.0.2 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@metaplex-foundation/beet-solana@0.3.1: + resolution: {integrity: sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==} + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@solana/web3.js': 1.98.0 + bs58: 5.0.0 + debug: 4.4.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@metaplex-foundation/beet-solana@0.4.0: + resolution: {integrity: sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ==} + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@solana/web3.js': 1.98.0 + bs58: 5.0.0 + debug: 4.4.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@metaplex-foundation/beet-solana@0.4.1: + resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@solana/web3.js': 1.98.0 + bs58: 5.0.0 + debug: 4.4.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@metaplex-foundation/beet@0.4.0: + resolution: {integrity: sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA==} + dependencies: + ansicolors: 0.3.2 + bn.js: 5.2.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: false + /@metaplex-foundation/beet@0.6.1: + resolution: {integrity: sha512-OYgnijLFzw0cdUlRKH5POp0unQECPOW9muJ2X3QIVyak5G6I6l/rKo72sICgPLIFKdmsi2jmnkuLY7wp14iXdw==} + dependencies: + ansicolors: 0.3.2 + bn.js: 5.2.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: false + /@metaplex-foundation/beet@0.7.1: + resolution: {integrity: sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==} + dependencies: + ansicolors: 0.3.2 + bn.js: 5.2.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: false + /@metaplex-foundation/beet@0.7.2: + resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} + dependencies: + ansicolors: 0.3.2 + assert: 2.1.0 + bn.js: 5.2.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + dev: false + /@metaplex-foundation/cusper@0.0.2: + resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} + dev: false + /@metaplex-foundation/mpl-auction-house@2.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-O+IAdYVaoOvgACB8pm+1lF5BNEjl0COkqny2Ho8KQZwka6aC/vHbZ239yRwAMtJhf5992BPFdT4oifjyE0O+Mw==} + dependencies: + '@metaplex-foundation/beet': 0.6.1 + '@metaplex-foundation/beet-solana': 0.3.1 + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: false + /@metaplex-foundation/mpl-bubblegum@0.7.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-HCo6q+nh8M3KRv9/aUaZcJo5/vPJEeZwPGRDWkqN7lUXoMIvhd83fZi7MB1rIg1gwpVHfHqim0A02LCYKisWFg==} + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet-solana': 0.4.0 + '@metaplex-foundation/cusper': 0.0.2 + '@metaplex-foundation/mpl-token-metadata': 2.13.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.98.0) + '@solana/spl-token': 0.1.8 + '@solana/web3.js': 1.98.0 + js-sha3: 0.8.0 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: false + /@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.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@2.13.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet-solana': 0.4.0 + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + debug: 4.4.0 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: false + /@metaplex-foundation/mpl-token-metadata@3.3.0(@metaplex-foundation/umi@0.9.2): + 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): + 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/rustbin@0.3.5: + resolution: {integrity: sha512-m0wkRBEQB/8krwMwKBvFugufZtYwMXiGHud2cTDAv+aGXK4M90y0Hx67/wpu+AqqoQfdV8VM9YezUOHKD+Z5kA==} + dependencies: + debug: 4.4.0 + semver: 7.6.3 + text-table: 0.2.0 + toml: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /@metaplex-foundation/solita@0.12.2: + resolution: {integrity: sha512-oczMfE43NNHWweSqhXPTkQBUbap/aAiwjDQw8zLKNnd/J8sXr/0+rKcN5yJIEgcHeKRkp90eTqkmt2WepQc8yw==} + hasBin: true + dependencies: + '@metaplex-foundation/beet': 0.4.0 + '@metaplex-foundation/beet-solana': 0.3.1 + '@metaplex-foundation/rustbin': 0.3.5 + '@solana/web3.js': 1.98.0 + camelcase: 6.3.0 + debug: 4.4.0 + js-sha256: 0.9.0 + prettier: 2.8.8 + snake-case: 3.0.4 + spok: 1.5.5 + transitivePeerDependencies: + - bufferutil + - encoding + - jiti + - supports-color + - utf-8-validate + dev: false + /@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0): + 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.98.0) + '@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) + '@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) + '@solana/web3.js': 1.98.0 + transitivePeerDependencies: + - encoding + dev: false + /@metaplex-foundation/umi-downloader-http@0.9.2(@metaplex-foundation/umi@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.98.0): + 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.98.0) + '@noble/curves': 1.7.0 + '@solana/web3.js': 1.98.0 + dev: false + /@metaplex-foundation/umi-http-fetch@0.9.2(@metaplex-foundation/umi@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: + resolution: {integrity: sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==} + dev: false + /@metaplex-foundation/umi-program-repository@0.9.2(@metaplex-foundation/umi@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: + 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): + 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.98.0): + 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.98.0) + '@solana/web3.js': 1.98.0 + dev: false + /@metaplex-foundation/umi-serializer-data-view@0.9.2(@metaplex-foundation/umi@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: + resolution: {integrity: sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w==} + dev: false + /@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: + resolution: {integrity: sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg==} + dependencies: + '@metaplex-foundation/umi-serializers-core': 0.8.9 + dev: false + /@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.98.0): + 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.98.0) + '@solana/web3.js': 1.98.0 + dev: false + /@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0): + 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.98.0 + buffer: 6.0.3 + dev: false + /@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@2.8.0: + resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} + engines: {node: '>= 10'} + dev: false + /@msgpack/msgpack@3.0.0-beta2: + resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} + engines: {node: '>= 14'} + dev: false + /@noble/curves@1.4.2: + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + dependencies: + '@noble/hashes': 1.4.0 + dev: false + /@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.4.0: + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + dev: false + /@noble/hashes@1.5.0: + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + dev: false + /@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: + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + dev: false + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.18.0 + dev: true + /@onsol/tldparser@0.6.7(@solana/web3.js@1.98.0)(bn.js@5.2.1)(borsh@0.7.0)(buffer@6.0.1): + resolution: {integrity: sha512-QwkRDLyC514pxeplCCXZ2kTiRcJSeUrpp+9o2XqLbePy/qzZGGG8I0UbXUKuWVD/bUL1zAm21+D+Eu30OKwcQg==} + engines: {node: '>=14'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + bn.js: ^5.2.1 + borsh: ^0.7.0 + buffer: 6.0.1 + dependencies: + '@ethersproject/sha2': 5.7.0 + '@metaplex-foundation/beet-solana': 0.4.1 + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + borsh: 0.7.0 + buffer: 6.0.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@opentelemetry/api@1.9.0: + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + dev: false + /@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3): + 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 + dependencies: + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + decimal.js: 10.4.3 + tiny-invariant: 1.3.3 + dev: false + /@orca-so/whirlpools-sdk@0.13.12(@coral-xyz/anchor@0.29.0)(@orca-so/common-sdk@0.6.4)(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3): + 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 + dependencies: + '@coral-xyz/anchor': 0.29.0 + '@orca-so/common-sdk': 0.6.4(@solana/spl-token@0.4.9)(@solana/web3.js@1.98.0)(decimal.js@10.4.3) + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + decimal.js: 10.4.3 + tiny-invariant: 1.3.3 + dev: false + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + /@pythnetwork/price-service-client@1.9.0: + resolution: {integrity: sha512-SLm3IFcfmy9iMqHeT4Ih6qMNZhJEefY14T9yTlpsH2D/FE5+BaGGnfcexUifVlfH6M7mwRC4hEFdNvZ6ebZjJg==} + deprecated: This package is deprecated and is no longer maintained. Please use @pythnetwork/hermes-client instead. + dependencies: + '@pythnetwork/price-service-sdk': 1.8.0 + '@types/ws': 8.5.13 + axios: 1.7.9 + axios-retry: 3.9.1 + isomorphic-ws: 4.0.1(ws@8.18.0) + ts-log: 2.2.7 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + /@pythnetwork/price-service-sdk@1.8.0: + resolution: {integrity: sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==} + dependencies: + bn.js: 5.2.1 + dev: false + /@raydium-io/raydium-sdk-v2@0.1.95-alpha(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-+u7yxo/R1JDysTCzOuAlh90ioBe2DlM2Hbcz/tFsxP/YzmnYQzShvNjcmc0361a4zJhmlrEJfpFXW0J3kkX5vA==} + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + 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 + /@saberhq/option-utils@1.15.0: + resolution: {integrity: sha512-XVbS9H4b8PIGXJGaErkOurxV2FKFyvMwYq0pD8Y1iEPoi6HB//+HnpEKAv8tCssIQ5Nn1zQWzmQ9CmGkrwzcsw==} + dependencies: + tslib: 2.8.1 + dev: false + /@saberhq/solana-contrib@1.15.0(@solana/web3.js@1.98.0)(bn.js@5.2.1): + resolution: {integrity: sha512-OExL5qGrNMmIKINU7qFUDmY7+xIwVM2s360g99k8CRNHSnjpnqIzwDjr2CnvEFpeQPp22OdGlS63woDp0w0JsQ==} + peerDependencies: + '@solana/web3.js': ^1.42 + bn.js: ^4 || ^5 + dependencies: + '@saberhq/option-utils': 1.15.0 + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.98.0 + '@types/promise-retry': 1.1.6 + '@types/retry': 0.12.5 + bn.js: 5.2.1 + promise-retry: 2.0.1 + retry: 0.13.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + dev: false + /@scure/base@1.1.9: + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + dev: false + /@scure/base@1.2.1: + resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + dev: false + /@scure/bip32@1.4.0: + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + dev: false + /@scure/bip39@1.3.0: + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + dev: false + /@shikijs/core@1.24.4: + resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} + dependencies: + '@shikijs/engine-javascript': 1.24.4 + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + dev: false + /@shikijs/engine-javascript@1.24.4: + resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} + dependencies: + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.8.1 + dev: false + /@shikijs/engine-oniguruma@1.24.4: + resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} + dependencies: + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + dev: false + /@shikijs/types@1.24.4: + resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} + dependencies: + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + dev: false + /@shikijs/vscode-textmate@9.3.1: + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + dev: false + /@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.98.0 + bigint-buffer: 1.1.5 + bignumber.js: 9.1.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@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: + resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} + dependencies: + '@solana/errors': 2.0.0-preview.2 + dev: false + /@solana/codecs-core@2.0.0-preview.4(typescript@5.7.2): + resolution: {integrity: sha512-A0VVuDDA5kNKZUinOqHxJQK32aKTucaVbvn31YenGzHX1gPqq+SOnFwgaEY6pq4XEopSmaK16w938ZQS8IvCnw==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + dev: false + /@solana/codecs-core@2.0.0-rc.1(typescript@4.9.5): + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + dev: false + /@solana/codecs-core@2.0.0-rc.1(typescript@5.7.2): + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 + dev: false + /@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-preview.4(typescript@5.7.2): + resolution: {integrity: sha512-nt2k2eTeyzlI/ccutPcG36M/J8NAYfxBPI9h/nQjgJ+M+IgOKi31JV8StDDlG/1XvY0zyqugV3I0r3KAbZRJpA==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/codecs-data-structures@2.0.0-rc.1(typescript@4.9.5): + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + dev: false + /@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.7.2): + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@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-preview.4(typescript@5.7.2): + resolution: {integrity: sha512-Q061rLtMadsO7uxpguT+Z7G4UHnjQ6moVIxAQxR58nLxDPCC7MB1Pk106/Z7NDhDLHTcd18uO6DZ7ajHZEn2XQ==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/codecs-numbers@2.0.0-rc.1(typescript@4.9.5): + resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + dev: false + /@solana/codecs-numbers@2.0.0-rc.1(typescript@5.7.2): + resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22): + 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-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-YDbsQePRWm+xnrfS64losSGRg8Wb76cjK1K6qfR8LPmdwIC3787x9uW5/E4icl/k+9nwgbIRXZ65lpF+ucZUnw==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + 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 + dev: false + /@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5): + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 4.9.5 + dev: false + /@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + 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 + dev: false + /@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22): + 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-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-gLMupqI4i+G4uPi2SGF/Tc1aXcviZF2ybC81x7Q/fARamNSgNOCUUoSCg9nWu1Gid6+UhA7LH80sWI8XjKaRog==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5): + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + dev: false + /@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/errors@2.0.0-preview.2: + resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} + hasBin: true + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + dev: false + /@solana/errors@2.0.0-preview.4(typescript@5.7.2): + resolution: {integrity: sha512-kadtlbRv2LCWr8A9V22On15Us7Nn8BvqNaOB4hXsTB3O0fU40D1ru2l+cReqLcRPij4znqlRzW9Xi0m6J5DIhA==} + hasBin: true + peerDependencies: + typescript: '>=5' + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + typescript: 5.7.2 + dev: false + /@solana/errors@2.0.0-rc.1(typescript@4.9.5): + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} + hasBin: true + peerDependencies: + typescript: '>=5' + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + typescript: 4.9.5 + dev: false + /@solana/errors@2.0.0-rc.1(typescript@5.7.2): + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} + hasBin: true + peerDependencies: + typescript: '>=5' + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + typescript: 5.7.2 + dev: false + /@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-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-tv2O/Frxql/wSe3jbzi5nVicIWIus/BftH+5ZR+r9r3FO0/htEllZS5Q9XdbmSboHu+St87584JXeDx3xm4jaA==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5): + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} + peerDependencies: + typescript: '>=5' + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + dev: false + /@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} + peerDependencies: + typescript: '>=5' + 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 + dev: false + /@solana/spl-account-compression@0.1.10(@solana/web3.js@1.98.0): + resolution: {integrity: sha512-IQAOJrVOUo6LCgeWW9lHuXo6JDbi4g3/RkQtvY0SyalvSWk9BIkHHe4IkAzaQw8q/BxEVBIjz8e9bNYWIAESNw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.50.1 + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1 + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + borsh: 0.7.0 + js-sha3: 0.8.0 + typescript-collections: 1.3.3 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@solana/spl-token-group@0.0.4(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22): + 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.98.0 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + dev: false + /@solana/spl-token-group@0.0.5(@solana/web3.js@1.95.3)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-CLJnWEcdoUBpQJfx9WEbX3h6nTdNiUzswfFdkABUik7HVwSNA98u5AYvBVK2H93d9PGMOHAak2lHW9xr+zAJGQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.94.0 + 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 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + dev: false + /@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + 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.7.2) + '@solana/web3.js': 1.98.0 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + dev: false + /@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.3)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + 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.7.2) + '@solana/web3.js': 1.95.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + dev: false + /@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5): + 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@4.9.5) + '@solana/web3.js': 1.98.0 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + dev: false + /@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + 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.7.2) + '@solana/web3.js': 1.98.0 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + dev: false + /@solana/spl-token@0.1.8: + resolution: {integrity: sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==} + engines: {node: '>= 10'} + dependencies: + '@babel/runtime': 7.26.0 + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + buffer: 6.0.3 + buffer-layout: 1.2.2 + dotenv: 10.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@solana/spl-token@0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5): + resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.88.0 + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0 + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/web3.js': 1.98.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /@solana/spl-token@0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.88.0 + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0 + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /@solana/spl-token@0.4.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + 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.98.0)(fastestsmallesttextencoderdecoder@1.0.22) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /@solana/spl-token@0.4.8(@solana/web3.js@1.95.3)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-RO0JD9vPRi4LsAbMUdNbDJ5/cv2z11MGhtAvFeRzT4+hAGE/FUzRi0tkkWtuCfSIU3twC6CtmAihRp/+XXjWsA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.94.0 + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0 + '@solana/spl-token-group': 0.0.5(@solana/web3.js@1.95.3)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.3)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.3 + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /@solana/spl-token@0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + 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.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + dev: false + /@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.3: + resolution: {integrity: sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==} + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.6.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.98.0: + resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.6.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 + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: false + /@tensor-hq/tensor-common@8.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-cgc+Z0nR23pi+1DfJgF1+afWd+xf1e6VYPM9yhECshmERr6BgojQfcuoltHHcgpwSlLrZXnm47kQ48I2M6rxFQ==} + dependencies: + '@coral-xyz/anchor': 0.26.0 + '@metaplex-foundation/mpl-auction-house': 2.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@metaplex-foundation/mpl-bubblegum': 0.7.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.98.0) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + axios: 0.28.1 + big.js: 6.2.2 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 5.0.0 + exponential-backoff: 3.1.1 + js-sha3: 0.8.0 + semaphore: 1.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: false + /@tensor-oss/tensorswap-sdk@4.5.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-eNM6k1DT5V/GadxSHm8//z2wlLl8/EcA0KFQXKaxRba/2MirNySsoVGxDXO2UdOI4eZMse8f+8Et3P63WWjsIw==} + dependencies: + '@coral-xyz/anchor': 0.26.0 + '@msgpack/msgpack': 2.8.0 + '@saberhq/solana-contrib': 1.15.0(@solana/web3.js@1.98.0)(bn.js@5.2.1) + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0 + '@tensor-hq/tensor-common': 8.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@types/bn.js': 5.1.6 + big.js: 6.2.2 + bn.js: 5.2.1 + js-sha256: 0.9.0 + keccak256: 1.0.6 + math-expression-evaluator: 2.0.6 + merkletreejs: 0.3.11 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: false + /@tiplink/api@0.3.1(fastestsmallesttextencoderdecoder@1.0.22)(sodium-native@3.4.1): + resolution: {integrity: sha512-HjnXethjKOHTYT0IP1BewlMS7wZJ+hsoDgRa6jA1cNvxvwQjE1WHOyvOUPpAi+DJDw4P4/omFtyHr7dwLfnB/g==} + dependencies: + '@coral-xyz/anchor': 0.29.0 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/web3.js': 1.98.0 + bs58: 5.0.0 + libsodium: 0.7.15 + libsodium-wrappers-sumo: 0.7.15 + nanoid: 3.3.8 + sodium-plus: 0.9.0(sodium-native@3.4.1) + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + typescript: 4.9.5 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - sodium-native + - utf-8-validate + dev: false + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: true + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + /@types/bn.js@5.1.6: + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + dependencies: + '@types/node': 22.10.2 + /@types/chai@5.0.1: + resolution: {integrity: sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA==} + dependencies: + '@types/deep-eql': 4.0.2 + dev: true + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 22.10.2 + dev: false + '@types/deep-eql@4.0.2': {} + '@types/diff-match-patch@1.0.36': {} + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + dev: false + /@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: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + /@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: + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + dependencies: + '@types/node': 22.10.2 + form-data: 4.0.1 + dev: false + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + /@types/node@18.19.69: + resolution: {integrity: sha512-ECPdY1nlaiO/Y6GUnwgtAAhLNaQ53AyIVz+eILxpEo5OvuqE6yWkqWBIb5dU0DqhKQtMeny+FBD3PK6lm7L5xQ==} + dependencies: + undici-types: 5.26.5 + dev: false + /@types/node@22.10.2: + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + dependencies: + undici-types: 6.20.0 + /@types/promise-retry@1.1.6: + resolution: {integrity: sha512-EC1+OMXV0PZb0pf+cmyxc43MEP2CDumZe4AfuxWboxxEixztIebknpJPZAX5XlodGF1OY+C1E/RAeNGzxf+bJA==} + dependencies: + '@types/retry': 0.12.5 + dev: false + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false + /@types/retry@0.12.5: + resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} + dev: false + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + dev: false + /@types/uuid@10.0.0: + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + dev: false + /@types/uuid@8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: false + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 22.10.2 + dev: false + /@types/ws@8.5.13: + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} + dependencies: + '@types/node': 22.10.2 + dev: false + /@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2)(eslint@8.56.0)(typescript@5.7.2): + resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.18.2(eslint@8.56.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/type-utils': 8.18.2(eslint@8.56.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@8.56.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.2 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@8.18.2(eslint@8.56.0)(typescript@5.7.2): + resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.4.0 + eslint: 8.56.0 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager@8.18.2: + resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + dev: true + /@typescript-eslint/type-utils@8.18.2(eslint@8.56.0)(typescript@5.7.2): + resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@8.56.0)(typescript@5.7.2) + debug: 4.4.0 + eslint: 8.56.0 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types@8.18.2: + resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + /@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2): + resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@8.18.2(eslint@8.56.0)(typescript@5.7.2): + resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.56.0) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + eslint: 8.56.0 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/visitor-keys@8.18.2: + resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.18.2 + eslint-visitor-keys: 4.2.0 + dev: true + /@ungap/structured-clone@1.2.1: + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + /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: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /acorn-jsx@5.3.2(acorn@8.14.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.14.0 + /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: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + /agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + ai@4.0.22(react@19.0.0)(zod@3.24.1): + dependencies: + '@ai-sdk/provider': 1.0.3 + '@ai-sdk/provider-utils': 2.0.5(zod@3.24.1) + '@ai-sdk/react': 1.0.7(react@19.0.0)(zod@3.24.1) + '@ai-sdk/ui-utils': 1.0.6(zod@3.24.1) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod-to-json-schema: 3.24.1(zod@3.24.1) + optionalDependencies: + react: 19.0.0 + zod: 3.24.1 + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + /ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + dev: false + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + /ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + dev: false + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + dev: false + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: false + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: false + /axios-retry@3.9.1: + resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} + dependencies: + '@babel/runtime': 7.26.0 + is-retry-allowed: 2.2.0 + dev: false + /axios@0.28.1: + resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==} + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /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: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + dev: false + /base-x@5.0.0: + resolution: {integrity: sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==} + dev: false + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: false + /big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + dev: false + /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: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: false + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + /bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + dev: false + /bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + dev: false + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + /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: + resolution: {integrity: sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==} + dev: false + /borsh@2.0.0: + resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} + dev: false + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.10 + dev: false + /bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + dependencies: + base-x: 4.0.0 + dev: false + /bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + dependencies: + base-x: 5.0.0 + dev: false + /buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + dev: false + /buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + dev: false + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /buffer@6.0.1: + resolution: {integrity: sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /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.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: false + /call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + dev: false + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.6 + set-function-length: 1.2.2 + dev: false + /call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + dev: false + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + /chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + dev: false + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + /chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: false + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /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: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: false + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + /cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + /crypto-hash@1.3.0: + resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} + engines: {node: '>=8'} + dev: false + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + /dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dev: false + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + /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: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: false + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: false + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: false + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: false + /delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + dev: false + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + diff-match-patch@1.0.5: {} + diff@4.0.2: {} + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: false + /dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + dev: false + /dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dev: false + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: false + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + /emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + dev: false + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + dev: false + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: false + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: false + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + /eslint-config-prettier@9.1.0(eslint@8.56.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.4.2): + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.56.0 + eslint-config-prettier: 9.1.0(eslint@8.56.0) + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + dev: true + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + /eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: false + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.56.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.1 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + dev: false + /espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + dev: false + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + dev: true + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + /ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + dependencies: + '@noble/hashes': 1.6.1 + dev: false + /ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + dev: false + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + dev: false + /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: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + eventemitter3@5.0.1: {} + eventsource-parser@3.0.0: {} + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: false + /eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + dev: false + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + /fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + dev: false + /fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + dev: false + /fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + dependencies: + reusify: 1.0.4 + dev: true + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: false + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + /find-process@1.4.8: + resolution: {integrity: sha512-W2PIdgXfhYeIlTzGiDyGJhjslZcwQCRcSw6plgyLu3CFk1PhQrKkTbQ5jkJ2NhOabMwETTrhl7c+xBcQ7B2jRg==} + hasBin: true + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + debug: 4.4.0 + eslint: 9.17.0 + glob: 11.0.0 + loglevel: 1.9.2 + rimraf: 6.0.1 + transitivePeerDependencies: + - jiti + - supports-color + dev: false + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + dev: false + /flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + /follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: false + /foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + dev: false + /form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: false + /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: + 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 + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + /get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: false + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + dev: false + /glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + dev: false + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: false + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + dev: false + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + requiresBuild: true + dev: false + optional: true + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + /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: + resolution: {integrity: sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==} + dependencies: + '@types/node': 18.19.69 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.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 + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: false + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + dev: false + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: false + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + /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: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: false + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + /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: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + dev: false + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: false + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: false + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dev: false + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + dev: false + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.18 + dev: false + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /isomorphic-ws@4.0.1(ws@7.5.10): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 7.5.10 + dev: false + /isomorphic-ws@4.0.1(ws@8.18.0): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + dev: false + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + dependencies: + '@isaacs/cliui': 8.0.2 + dev: false + /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: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + dev: false + /js-sha256@0.11.0: + resolution: {integrity: sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==} + dev: false + /js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + dev: false + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + /js-tiktoken@1.0.16: + resolution: {integrity: sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==} + dependencies: + base64-js: 1.5.1 + dev: false + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-schema-traverse@0.4.1: {} + json-schema@0.4.0: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: {} + json5@2.2.3: {} + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: false + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + /keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + keccak: 3.0.4 + dev: false + /keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + dev: false + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + /langchain@0.3.8(@langchain/core@0.3.26)(@langchain/groq@0.1.2)(openai@4.77.0): + resolution: {integrity: sha512-EiAHFgBdThuXFmIx9j81wjdPItpRsw0Ck4r5dyhB74gyhehRGna/UK2CTqeKVnIUM/f4g4JbxUgAU4voXljDMw==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/anthropic': '*' + '@langchain/aws': '*' + '@langchain/cohere': '*' + '@langchain/core': '>=0.2.21 <0.4.0' + '@langchain/google-genai': '*' + '@langchain/google-vertexai': '*' + '@langchain/groq': '*' + '@langchain/mistralai': '*' + '@langchain/ollama': '*' + axios: '*' + cheerio: '*' + handlebars: ^4.7.8 + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + '@langchain/anthropic': + optional: true + '@langchain/aws': + optional: true + '@langchain/cohere': + optional: true + '@langchain/google-genai': + optional: true + '@langchain/google-vertexai': + optional: true + '@langchain/groq': + optional: true + '@langchain/mistralai': + optional: true + '@langchain/ollama': + optional: true + axios: + optional: true + cheerio: + optional: true + handlebars: + optional: true + peggy: + optional: true + typeorm: + optional: true + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0) + '@langchain/groq': 0.1.2(@langchain/core@0.3.26) + '@langchain/openai': 0.3.16(@langchain/core@0.3.26) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.26) + js-tiktoken: 1.0.16 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.2.14(openai@4.77.0) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.7.0 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - encoding + - openai + dev: false + /langsmith@0.2.14(openai@4.77.0): + resolution: {integrity: sha512-ClAuAgSf3m9miMYotLEaZKQyKdaWlfjhebCuYco8bc6g72dU2VwTg31Bv4YINBq7EH2i1cMwbOiJxbOXPqjGig==} + peerDependencies: + openai: '*' + peerDependenciesMeta: + openai: + optional: true + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + openai: 4.77.0(zod@3.24.1) + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.6.3 + uuid: 10.0.0 + dev: false + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + /libsodium-sumo@0.7.15: + resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} + dev: false + /libsodium-wrappers-sumo@0.7.15: + resolution: {integrity: sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==} + dependencies: + libsodium-sumo: 0.7.15 + dev: false + /libsodium-wrappers@0.7.15: + resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==} + dependencies: + libsodium: 0.7.15 + dev: false + /libsodium@0.7.15: + resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==} + dev: false + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: false + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + /loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + dev: false + /loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + dev: false + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.8.1 + dev: false + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: false + /lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + dev: false + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: false + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + /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 + /math-expression-evaluator@2.0.6: + resolution: {integrity: sha512-DRung1qNcKbgkhFeQ0fBPUFB6voRUMY7KyRyp1TRQ2v95Rp2egC823xLRooM1mDx1rmbkY7ym6ZWmpaE/VimOA==} + dev: false + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: false + /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: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: false + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + /merkletreejs@0.3.11: + resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + engines: {node: '>= 7.6.0'} + dependencies: + bignumber.js: 9.1.2 + buffer-reverse: 1.0.1 + crypto-js: 4.2.0 + treeify: 1.1.0 + web3-utils: 1.10.4 + dev: false + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: false + /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: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + dev: false + /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: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + dev: false + /micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + dev: false + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + /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 + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + /minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + /nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + dev: false + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + dev: false + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + dev: false + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + dev: false + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dev: false + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: false + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + /oniguruma-to-es@0.8.1: + resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + dev: false + /openai@4.77.0(zod@3.24.1): + resolution: {integrity: sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==} + hasBin: true + peerDependencies: + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@types/node': 18.19.69 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.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: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + /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: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: false + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: false + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + dev: false + /pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: false + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: false + /path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + dev: false + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + dev: false + /percentile@1.6.0: + resolution: {integrity: sha512-8vSyjdzwxGDHHwH+cSGch3A9Uj2On3UpgOWxWXMKwUvoAbnujx6DaqmV1duWXNiH/oEWpyVd6nSQccix6DM3Ng==} + dev: false + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + /poly1305-js@0.4.4: + resolution: {integrity: sha512-5B6/S+vg5AOr66wJDkh5LOpU/F3EKANDy4VXKsNZLXea1uCy6CiOWOZ3VhcC0nYdhE7vJUMcLxqcVlrv2g/+Rg==} + dependencies: + big-integer: 1.6.52 + dev: false + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: false + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: false + /prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + /prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} + dependencies: + '@opentelemetry/api': 1.9.0 + tdigest: 0.1.2 + dev: false + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: false + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + dev: false + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: false + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + react@19.0.0: {} + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + /regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + dev: false + /regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + dev: false + /regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + dependencies: + regex-utilities: 2.3.0 + dev: false + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + dependencies: + glob: 10.4.5 + dev: false + /rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.1 + dev: false + /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.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + dev: false + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + safe-buffer@5.2.1: {} + secure-json-parse@2.7.0: {} + /semaphore@1.1.0: + resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} + engines: {node: '>=0.8.0'} + dev: false + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: false + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + /shiki@1.24.4: + resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} + dependencies: + '@shikijs/core': 1.24.4 + '@shikijs/engine-javascript': 1.24.4 + '@shikijs/engine-oniguruma': 1.24.4 + '@shikijs/types': 1.24.4 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + dev: false + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + dev: false + /sodium-native@3.4.1: + resolution: {integrity: sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ==} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: false + /sodium-plus@0.9.0(sodium-native@3.4.1): + resolution: {integrity: sha512-WWKxrd81qDL7C1A10yxNmZ135yovEZuIRnZ/BIf/FcajYBupbKbPdgzwlusPHLVxkMDDamcarq9PxxRBUSqpCw==} + peerDependencies: + sodium-native: ^3.2.0 + dependencies: + buffer: 5.7.1 + libsodium-wrappers: 0.7.15 + poly1305-js: 0.4.4 + sodium-native: 3.4.1 + typedarray-to-buffer: 3.1.5 + xsalsa20: 1.2.0 + dev: false + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + /spok@1.5.5: + resolution: {integrity: sha512-IrJIXY54sCNFASyHPOY+jEirkiJ26JDqsGiI0Dvhwcnkl0PEWi1PSsrkYql0rzDw8LFVTcA7rdUCAJdE2HE+2Q==} + dependencies: + ansicolors: 0.3.2 + find-process: 1.4.8 + transitivePeerDependencies: + - jiti + - supports-color + dev: false + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /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-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.1.0 + dev: false + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + dev: false + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + /superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + dev: false + /superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + dev: false + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + swr@2.3.0(react@19.0.0): + dependencies: + dequal: 2.0.3 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + dev: true + /tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + dependencies: + bintrees: 1.0.2 + dev: false + /text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + dev: false + text-table@0.2.0: {} + throttleit@2.1.0: {} + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + /tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + dev: false + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + /toformat@2.0.0: + resolution: {integrity: sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==} + dev: false + /toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + dev: false + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + dev: false + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + /ts-api-utils@1.4.3(typescript@5.7.2): + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.7.2 + dev: true + /ts-log@2.2.7: + resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} + dev: false + /ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.10.2 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.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'} + 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==} + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + dev: false + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: false + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + /typedoc@0.26.11(typescript@5.7.2): + 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 + dependencies: + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + shiki: 1.24.4 + typescript: 5.7.2 + yaml: 2.7.0 + dev: false + /typedoc@0.27.6(typescript@5.7.2): + resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x + dependencies: + '@gerrit0/mini-shiki': 1.24.4 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.7.2 + yaml: 2.7.0 + dev: false + /typescript-collections@1.3.3: + resolution: {integrity: sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ==} + dev: false + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: false + /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==} + dev: false + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + /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==} + 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==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + 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==} + 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 + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + use-sync-external-store@1.4.0(react@19.0.0): + dependencies: + react: 19.0.0 + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + dev: false + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + dev: false + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.0.10 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + dev: false + /uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + dev: false + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + 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==} + 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@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + /web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + dev: false + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: false + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + /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.9)(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: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + dev: false + /xsalsa20@1.2.0: + resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} + dev: false + /yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + dev: false + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + /zod-to-json-schema@3.24.1(zod@3.24.1): + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + peerDependencies: + zod: ^3.24.1 + dependencies: + zod: 3.24.1 + dev: false + /zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + dev: false + /zstddec@0.0.2: + resolution: {integrity: sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA==} + dev: false + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/src/agent/index.ts b/src/agent/index.ts index 19a8492..3f811bd 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -55,6 +55,9 @@ import { fetchTokenReportSummary, fetchTokenDetailedReport, OrderParams, + voltrGetAssetAmount, + voltrDepositStrategy, + voltrWithdrawStrategy, } from "../tools"; import { @@ -497,4 +500,24 @@ export class SolanaAgentKit { async fetchTokenDetailedReport(mint: string): Promise { return fetchTokenDetailedReport(mint); } + + async voltrDepositStrategy( + depositAmount: BN, + vault: PublicKey, + strategy: PublicKey, + ): Promise { + return voltrDepositStrategy(this, depositAmount, vault, strategy); + } + + async voltrWithdrawStrategy( + withdrawAmount: BN, + vault: PublicKey, + strategy: PublicKey, + ): Promise { + return voltrWithdrawStrategy(this, withdrawAmount, vault, strategy); + } + + async voltrGetAssetAmount(vault: PublicKey): Promise { + return voltrGetAssetAmount(this, vault); + } } diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 72a1f5b..2fbe3cc 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -2013,6 +2013,91 @@ export class SolanaFetchTokenDetailedReportTool extends Tool { } } +export class SolanaVoltrDepositStrategy extends Tool { + name = "solana_voltr_deposit_strategy"; + description = `Deposit amount into a strategy for Voltr's vaults + + Inputs (input is a json string): + depositAmount: number (required) + vault: string (required) + strategy: string (required) + `; + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + async _call(input: string): Promise { + try { + let inputFormat = JSON.parse(input); + const tx = await this.solanaKit.voltrDepositStrategy( + new BN(inputFormat.depositAmount), + new PublicKey(inputFormat.vault), + new PublicKey(inputFormat.strategy), + ); + return JSON.stringify({ + status: "success", + message: `Deposited ${inputFormat.depositAmount} into strategy ${inputFormat.strategy} of vault ${inputFormat.vault} successfully`, + transaction: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaVoltrWithdrawStrategy extends Tool { + name = "solana_voltr_withdraw_strategy"; + description = `Withdraw amount from a strategy for Voltr's vaults + + Inputs (input is a json string): + withdrawAmount: number (required) + vault: string (required) + strategy: string (required) + `; + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + async _call(input: string): Promise { + try { + let inputFormat = JSON.parse(input); + const tx = await this.solanaKit.voltrWithdrawStrategy( + new BN(inputFormat.withdrawAmount), + new PublicKey(inputFormat.vault), + new PublicKey(inputFormat.strategy), + ); + return JSON.stringify({ + status: "success", + message: `Withdrew ${inputFormat.withdrawAmount} from strategy ${inputFormat.strategy} of vault ${inputFormat.vault} successfully`, + transaction: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaVoltrGetAssetAmount extends Tool { + name = "solana_voltr_get_asset_amount"; + description = `Get the total asset amount and current amount for each strategy of a given Voltr vault + + Inputs: + vault: string (required) + `; + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + async _call(input: string): Promise { + return this.solanaKit.voltrGetAssetAmount(new PublicKey(input)); + } +} + export function createSolanaTools(solanaKit: SolanaAgentKit) { return [ new SolanaBalanceTool(solanaKit), @@ -2065,5 +2150,8 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaCancelNFTListingTool(solanaKit), new SolanaFetchTokenReportSummaryTool(solanaKit), new SolanaFetchTokenDetailedReportTool(solanaKit), + new SolanaVoltrDepositStrategy(solanaKit), + new SolanaVoltrWithdrawStrategy(solanaKit), + new SolanaVoltrGetAssetAmount(solanaKit), ]; } diff --git a/src/tools/index.ts b/src/tools/index.ts index 825dff8..2e6f4db 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -58,3 +58,7 @@ export * from "./create_tiplinks"; export * from "./tensor_trade"; export * from "./rugcheck"; + +export * from "./voltr_deposit_strategy"; +export * from "./voltr_withdraw_strategy"; +export * from "./voltr_get_asset_amount"; \ No newline at end of file diff --git a/src/tools/voltr_deposit_strategy.ts b/src/tools/voltr_deposit_strategy.ts new file mode 100644 index 0000000..4d2aa22 --- /dev/null +++ b/src/tools/voltr_deposit_strategy.ts @@ -0,0 +1,77 @@ +import { VoltrClient } from "@voltr/sdk"; +import { SolanaAgentKit } from "../agent"; +import { + PublicKey, + sendAndConfirmTransaction, + Transaction, +} from "@solana/web3.js"; +import BN from "bn.js"; + +/** + * Deposits assets into a Voltr strategy + * @param agent SolanaAgentKit instance + * @param depositAmount Amount to deposit in base units (BN) + * @param vault Public key of the target vault + * @param strategy Public key of the target strategy + * @returns Transaction signature for the deposit + */ +export async function voltrDepositStrategy( + agent: SolanaAgentKit, + depositAmount: BN, + vault: PublicKey, + strategy: PublicKey, +): Promise { + const vc = new VoltrClient(agent.connection, agent.wallet); + const { vaultAssetIdleAuth } = vc.findVaultAddresses(vault); + const vaultAccount = await vc.fetchVaultAccount(vault); + const vaultAssetMint = vaultAccount.asset.assetMint; + const strategyAccount = await vc.fetchStrategyAccount(strategy); + const liquidityReserve = strategyAccount.counterpartyAssetTa; + const protocolProgram = strategyAccount.protocolProgram; + const vaultStrategy = vc.findVaultStrategy(vaultAssetIdleAuth, strategy); + + const response = await fetch( + `https://voltr.xyz/api/remaining-accounts/deposit-strategy?vault=${vault.toBase58()}&strategy=${strategy.toBase58()}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }, + ); + + const data = (await response.json()).data as { + pubkey: string; + isSigner: boolean; + isWritable: boolean; + }[]; + + const remainingAccounts = data.map((account) => ({ + pubkey: new PublicKey(account.pubkey), + isSigner: account.isSigner, + isWritable: account.isWritable, + })); + + const depositIx = await vc.createDepositStrategyIx(depositAmount, { + vault, + vaultAssetMint, + strategy: strategy, + vaultStrategy: vaultStrategy, + counterpartyAssetTa: liquidityReserve, + protocolProgram: protocolProgram, + remainingAccounts, + }); + + const transaction = new Transaction(); + transaction.add(depositIx); + + const txSig = await sendAndConfirmTransaction( + agent.connection, + transaction, + [agent.wallet], + { + commitment: "confirmed", + }, + ); + return txSig; +} diff --git a/src/tools/voltr_get_asset_amount.ts b/src/tools/voltr_get_asset_amount.ts new file mode 100644 index 0000000..9d16923 --- /dev/null +++ b/src/tools/voltr_get_asset_amount.ts @@ -0,0 +1,33 @@ +import { VoltrClient } from "@voltr/sdk"; +import { SolanaAgentKit } from "../agent"; +import { PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; + +/** + * Deposits assets into a Voltr strategy + * @param agent SolanaAgentKit instance + * @param vault Public key of the target vault + * @returns Transaction signature for the deposit + */ +export async function voltrGetAssetAmount( + agent: SolanaAgentKit, + vault: PublicKey, +): Promise { + const vc = new VoltrClient(agent.connection, agent.wallet); + const vaultAccount = await vc.fetchVaultAccount(vault); + const totalAssetAmount: BN = vaultAccount.asset.totalAmount; + const { vaultAssetIdleAuth } = vc.findVaultAddresses(vault); + const vaultStrategyAccounts = + await vc.fetchVaultStrategyAccounts(vaultAssetIdleAuth); + const strategyInfo = vaultStrategyAccounts.map((vaultStrategyAccount) => ({ + strategyId: vaultStrategyAccount.account.strategy.toBase58(), + amount: vaultStrategyAccount.account.currentAmount.toString(), + })); + + const result = { + totalAmount: totalAssetAmount.toString(), + strategies: strategyInfo, + }; + + return JSON.stringify(result); +} diff --git a/src/tools/voltr_withdraw_strategy.ts b/src/tools/voltr_withdraw_strategy.ts new file mode 100644 index 0000000..6e8ed27 --- /dev/null +++ b/src/tools/voltr_withdraw_strategy.ts @@ -0,0 +1,97 @@ +import { VoltrClient } from "@voltr/sdk"; +import { SolanaAgentKit } from "../agent"; +import { + PublicKey, + sendAndConfirmTransaction, + Transaction, +} from "@solana/web3.js"; +import BN from "bn.js"; +import { + Account, + getAccount, + TOKEN_2022_PROGRAM_ID, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; + +/** + * Withdraws assets from a Voltr strategy + * @param agent SolanaAgentKit instance + * @param withdrawAmount Amount to withdraw in base units (BN) + * @param vault Public key of the target vault + * @param strategy Public key of the target strategy + * @returns Transaction signature for the deposit + */ +export async function voltrWithdrawStrategy( + agent: SolanaAgentKit, + withdrawAmount: BN, + vault: PublicKey, + strategy: PublicKey, +): Promise { + const vc = new VoltrClient(agent.connection, agent.wallet); + const { vaultAssetIdleAuth } = vc.findVaultAddresses(vault); + const vaultAccount = await vc.fetchVaultAccount(vault); + const vaultAssetMint = vaultAccount.asset.assetMint; + const strategyAccount = await vc.fetchStrategyAccount(strategy); + const liquidityReserve = strategyAccount.counterpartyAssetTa; + const protocolProgram = strategyAccount.protocolProgram; + const vaultStrategy = vc.findVaultStrategy(vaultAssetIdleAuth, strategy); + + let liquidityReserveAccount: Account; + try { + liquidityReserveAccount = await getAccount( + agent.connection, + liquidityReserve, + "confirmed", + TOKEN_PROGRAM_ID, + ); + } catch (error) { + liquidityReserveAccount = await getAccount( + agent.connection, + liquidityReserve, + "confirmed", + TOKEN_2022_PROGRAM_ID, + ); + } + const liquidityReserveAuth = liquidityReserveAccount.owner; + + const response = await fetch( + `https://voltr.xyz/api/remaining-accounts/withdraw-strategy?vault=${vault.toBase58()}&strategy=${strategy.toBase58()}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }, + ); + + const data = (await response.json()).data as { + pubkey: string; + isSigner: boolean; + isWritable: boolean; + }[]; + + const remainingAccounts = data.map((account) => ({ + pubkey: new PublicKey(account.pubkey), + isSigner: account.isSigner, + isWritable: account.isWritable, + })); + + const withdrawIx = await vc.createWithdrawStrategyIx(withdrawAmount, { + vault, + vaultAssetMint, + strategy: strategy, + vaultStrategy: vaultStrategy, + counterpartyAssetTa: liquidityReserve, + counterpartyAssetTaAuth: liquidityReserveAuth, + protocolProgram: protocolProgram, + remainingAccounts, + }); + + const transaction = new Transaction(); + transaction.add(withdrawIx); + + const txSig = await sendAndConfirmTransaction(agent.connection, transaction, [ + agent.wallet, + ]); + return txSig; +} From 23ca0b0fba07db96fb8130015990d3d902d61182 Mon Sep 17 00:00:00 2001 From: biccsdev Date: Tue, 7 Jan 2025 15:01:21 -0600 Subject: [PATCH 03/32] refactoring for standarization --- README.md | 19 ++++++------------- src/agent/index.ts | 25 +++++++++++++++++++++---- test/tools/3land.ts | 11 +++-------- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index c46e0c3..ee42e5e 100644 --- a/README.md +++ b/README.md @@ -132,10 +132,7 @@ console.log("Token Mint Address:", result.mint.toString()); ``` ### Create NFT Collection on 3Land ```typescript -const optionsWithBase58: StoreInitOptions = { - privateKey: "", - isMainnet: true, // if false, collection will be created on devnet 3.land (dev.3.land) -}; +const isDevnet = true; // (Optional) if not present TX takes place in Mainnet const collectionOpts: CreateCollectionOptions = { collectionName: "", @@ -145,18 +142,16 @@ const optionsWithBase58: StoreInitOptions = { }; const result = await agent.create3LandCollection( - optionsWithBase58, - collectionOpts + collectionOpts, + isDevnet, // (Optional) if not present TX takes place in Mainnet ); ``` ### Create NFT on 3Land When creating an NFT using 3Land's tool, it automatically goes for sale on 3.land website ```typescript -const optionsWithBase58: StoreInitOptions = { - privateKey: "", - isMainnet: true, // if false, listing will be on devnet 3.land (dev.3.land) -}; +const isDevnet = true; // (Optional) if not present TX takes place in Mainnet + const collectionAccount = ""; //hash for the collection const createItemOptions: CreateSingleOptions = { itemName: "", @@ -171,12 +166,10 @@ const createItemOptions: CreateSingleOptions = { mainImageUrl: "", splHash: "", //present if listing is on a specific SPL token, if not present sale will be on $SOL }; -const isMainnet = true; const result = await agent.create3LandNft( - optionsWithBase58, collectionAccount, createItemOptions, - isMainnet + isDevnet, // (Optional) if not present TX takes place in Mainnet ); ``` diff --git a/src/agent/index.ts b/src/agent/index.ts index 07cb294..e5fda5b 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -574,24 +574,41 @@ export class SolanaAgentKit { } async create3LandCollection( - optionsWithBase58: StoreInitOptions, collectionOpts: CreateCollectionOptions, + isDevnet: boolean = false, ): Promise { + let optionsWithBase58: StoreInitOptions = { + privateKey: this.wallet.secretKey, + }; + if (isDevnet) { + optionsWithBase58.isMainnet = false; + } else { + optionsWithBase58.isMainnet = true; + } + const tx = await createCollection(optionsWithBase58, collectionOpts); return `Transaction: ${tx}`; } async create3LandNft( - optionsWithBase58: StoreInitOptions, collectionAccount: string, createItemOptions: CreateSingleOptions, - isMainnet: boolean, + isDevnet: boolean = false, ): Promise { + let optionsWithBase58: StoreInitOptions = { + privateKey: this.wallet.secretKey, + }; + if (isDevnet) { + optionsWithBase58.isMainnet = false; + } else { + optionsWithBase58.isMainnet = true; + } + const tx = await createSingle( optionsWithBase58, collectionAccount, createItemOptions, - isMainnet, + !isDevnet, ); return `Transaction: ${tx}`; } diff --git a/test/tools/3land.ts b/test/tools/3land.ts index aadc634..b482312 100644 --- a/test/tools/3land.ts +++ b/test/tools/3land.ts @@ -13,10 +13,7 @@ const agent = new SolanaAgentKit( { OPENAI_API_KEY: process.env.OPENAI_API_KEY! }, ); -const optionsWithBase58: StoreInitOptions = { - privateKey: process.env.SOLANA_PRIVATE_KEY!, - isMainnet: false, -}; +const isDevnet = true; /****************************** CREATING COLLECTION ******************************** */ @@ -29,8 +26,8 @@ const collectionOpts: CreateCollectionOptions = { (async () => { const collection = await agent.create3LandCollection( - optionsWithBase58, collectionOpts, + isDevnet, ); console.log("collection: ", collection); @@ -49,13 +46,11 @@ const createItemOptions: CreateSingleOptions = { mainImageUrl: "", }; -const isMainnet = false; (async () => { const result = agent.create3LandNft( - optionsWithBase58, collectionAccount, createItemOptions, - isMainnet, + isDevnet, ); console.log("result: ", result); })(); From b4b36e5adb177c68e40192898ac15df89b3e55dc Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Thu, 9 Jan 2025 21:13:00 +0100 Subject: [PATCH 04/32] feat: add drift vault tools --- package.json | 7 +- pnpm-lock.yaml | 1696 +++++++++++++++++++++++++++++++++++++- src/tools/drift_vault.ts | 507 ++++++++++++ 3 files changed, 2193 insertions(+), 17 deletions(-) create mode 100644 src/tools/drift_vault.ts diff --git a/package.json b/package.json index 70d54c7..1f641c8 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "@ai-sdk/openai": "^1.0.11", "@bonfida/spl-name-service": "^3.0.7", "@cks-systems/manifest-sdk": "0.1.59", - "@coral-xyz/anchor": "0.29", + "@coral-xyz/anchor": "~0.29.0", + "@drift-labs/sdk": "2.107.0-beta.1", + "@drift-labs/vaults-sdk": "^0.2.46", "@langchain/core": "^0.3.26", "@langchain/groq": "^0.1.2", "@langchain/langgraph": "^0.2.36", @@ -76,5 +78,6 @@ "prettier": "^3.4.2", "ts-node": "^10.9.2", "typescript": "^5.7.2" - } + }, + "packageManager": "pnpm@9.15.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55c2dca..40b31cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,14 @@ importers: specifier: 0.1.59 version: 0.1.59(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@coral-xyz/anchor': - specifier: '0.29' + specifier: ~0.29.0 version: 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@drift-labs/sdk': + specifier: 2.107.0-beta.1 + version: 2.107.0-beta.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@drift-labs/vaults-sdk': + specifier: ^0.2.46 + version: 0.2.46(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) '@langchain/core': specifier: ^0.3.26 version: 0.3.27(openai@4.77.3(zod@3.24.1)) @@ -234,12 +240,19 @@ packages: peerDependencies: '@solana/web3.js': ^1.87.3 + '@brokerloop/ttlcache@3.2.3': + resolution: {integrity: sha512-kZWoyJGBYTv1cL5oHBYEixlJysJBf2RVnub3gbclD+dwaW9aKubbHzbZ9q1q6bONosxaOqMsoBorOrZKzBDiqg==} + '@cfworker/json-schema@4.0.3': resolution: {integrity: sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==} '@cks-systems/manifest-sdk@0.1.59': resolution: {integrity: sha512-ZYTwwDxrC2u74kF30iWZPZPYXB9MtOydLd4/SQdlMXrb6bj1OooMtZxukSCu/Tlkp+KR26bEr6gYuErFHdUFjg==} + '@coral-xyz/anchor-errors@0.30.1': + resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==} + engines: {node: '>=10'} + '@coral-xyz/anchor@0.26.0': resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==} engines: {node: '>=11'} @@ -248,10 +261,18 @@ packages: resolution: {integrity: sha512-+P/vPdORawvg3A9Wj02iquxb4T0C5m4P6aZBVYysKl4Amk+r6aMPZkUhilBkD6E4Nuxnoajv3CFykUfkGE0n5g==} engines: {node: '>=11'} + '@coral-xyz/anchor@0.28.0': + resolution: {integrity: sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw==} + engines: {node: '>=11'} + '@coral-xyz/anchor@0.29.0': resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} engines: {node: '>=11'} + '@coral-xyz/anchor@0.30.1': + resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==} + engines: {node: '>=11'} + '@coral-xyz/borsh@0.26.0': resolution: {integrity: sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==} engines: {node: '>=10'} @@ -286,6 +307,17 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@drift-labs/sdk@2.107.0-beta.1': + resolution: {integrity: sha512-BbmZbVSE9XYh5W5pxfYbgntjU088X3JKzrrzFaLjngugVRNIWqMu6u0x0ugK+4ynzJcPPcyRg4rYvPmN7Ofg8g==} + engines: {node: '>=20.18.0'} + + '@drift-labs/vaults-sdk@0.2.46': + resolution: {integrity: sha512-u0OO7Nfhgr9B06CNX3VDXQNqACUWrznWKaYnS3/v/yM/oUSfq+zO1z3MCRnqcdTcbmF7BwmvB2haCoj/6flkhw==} + engines: {node: '>=16'} + + '@ellipsis-labs/phoenix-sdk@1.4.5': + resolution: {integrity: sha512-vEYgMXuV5/mpnpEi+VK4HO8f6SheHtVLdHHlULBiDN1eECYmL67gq+/cRV7Ar6jAQ7rJZL7xBxhbUW5kugMl6A==} + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -424,6 +456,15 @@ packages: '@gerrit0/mini-shiki@1.26.1': resolution: {integrity: sha512-gHFUvv9f1fU2Piou/5Y7Sx5moYxcERbC7CXc6rkDLQTUBg5Dgg9L4u29/nHqfoQ3Y9R0h0BcOhd14uOEZIBP7Q==} + '@grpc/grpc-js@1.12.5': + resolution: {integrity: sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -456,10 +497,20 @@ packages: '@irys/arweave@0.0.2': resolution: {integrity: sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==} + '@irys/query@0.0.1': + resolution: {integrity: sha512-7TCyR+Qn+F54IQQx5PlERgqNwgIQik8hY55iZl/silTHhCo1MI2pvx5BozqPUVCc8/KqRsc2nZd8Bc29XGUjRQ==} + engines: {node: '>=16.10.0'} + '@irys/query@0.0.8': resolution: {integrity: sha512-J8zCZDos2vFogSbroCJHZJq5gnPZEal01Iy3duXAotjIMgrI2ElDANiqEbaP1JAImR1jdUo1ChJnZB7MRLN9Hw==} engines: {node: '>=16.10.0'} + '@irys/sdk@0.0.2': + resolution: {integrity: sha512-un/e/CmTpgT042gDwCN3AtISrR9OYGMY6V+442pFmSWKrwrsDoIXZ8VlLiYKnrtTm+yquGhjfYy0LDqGWq41pA==} + engines: {node: '>=16.10.0'} + deprecated: 'Arweave support is deprecated - We recommend migrating to the Irys datachain: https://migrate-to.irys.xyz/' + hasBin: true + '@irys/sdk@0.2.11': resolution: {integrity: sha512-z3zKlKYEqRHuCGyyVoikL1lT4Jwt8wv7e4MrMThNfhfT/bdKQHD9lEVsX77DBnLJrBBKKg5rRcEzMtVkpNx3QA==} engines: {node: '>=16.10.0'} @@ -480,6 +531,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@langchain/core@0.3.27': resolution: {integrity: sha512-jtJKbJWB1NPU1YvtrExOB2rumvUFgkJwlWGxyjSIV9A6zcLVmUbcZGV8fCSuXgl5bbzOIQLJ1xcLYQmbW9TkTg==} engines: {node: '>=18'} @@ -517,6 +571,36 @@ packages: peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' + '@ledgerhq/devices@6.27.1': + resolution: {integrity: sha512-jX++oy89jtv7Dp2X6gwt3MMkoajel80JFWcdc0HCouwDsV1mVJ3SQdwl/bQU0zd8HI6KebvUP95QTwbQLLK/RQ==} + + '@ledgerhq/devices@8.4.4': + resolution: {integrity: sha512-sz/ryhe/R687RHtevIE9RlKaV8kkKykUV4k29e7GAVwzHX1gqG+O75cu1NCJUHLbp3eABV5FdvZejqRUlLis9A==} + + '@ledgerhq/errors@6.19.1': + resolution: {integrity: sha512-75yK7Nnit/Gp7gdrJAz0ipp31CCgncRp+evWt6QawQEtQKYEDfGo10QywgrrBBixeRxwnMy1DP6g2oCWRf1bjw==} + + '@ledgerhq/hw-app-solana@7.2.4': + resolution: {integrity: sha512-1k6XdTFNUJyk9GpXtymPRYq+OdMPIkPZ681ZkrMdSquTJV7W0LgK2oq1BacOVaVe6yDZKEqdR10RUTalhX1Mjg==} + + '@ledgerhq/hw-transport-node-hid-noevents@6.30.5': + resolution: {integrity: sha512-nOPbhFU87LgLERVAQ+HhxV8E8c+7d8ptllkgiJUc4QwL2z9zkIOAEtgdvCaZ066Oi9XGnln/GF1oAgByYnYDPw==} + + '@ledgerhq/hw-transport-node-hid@6.29.5': + resolution: {integrity: sha512-2bAp4K50V1kdCufU9JdQPcw4aLyvA+yQRJU/X39B+PC+rnis40gEbqNh0henhzv876sXdbNk6G/MkDWXpwDIow==} + + '@ledgerhq/hw-transport-webhid@6.27.1': + resolution: {integrity: sha512-u74rBYlibpbyGblSn74fRs2pMM19gEAkYhfVibq0RE1GNFjxDMFC1n7Sb+93Jqmz8flyfB4UFJsxs8/l1tm2Kw==} + + '@ledgerhq/hw-transport@6.27.1': + resolution: {integrity: sha512-hnE4/Fq1YzQI4PA1W0H8tCkI99R3UWDb3pJeZd6/Xs4Qw/q1uiQO+vNLC6KIPPhK0IajUfuI/P2jk0qWcMsuAQ==} + + '@ledgerhq/hw-transport@6.31.4': + resolution: {integrity: sha512-6c1ir/cXWJm5dCWdq55NPgCJ3UuKuuxRvf//Xs36Bq9BwkV2YaRQhZITAkads83l07NAdR16hkTWqqpwFMaI6A==} + + '@ledgerhq/logs@6.12.0': + resolution: {integrity: sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==} + '@lightprotocol/compressed-token@0.17.1': resolution: {integrity: sha512-493KCmZGw1BcHVRJaeRm8EEs+L7gX8dwY7JG13w2pfgOMtZXZ7Wxt261jFJxQJzRLTrUSlrbRJOmfW1+S1Y8SQ==} peerDependencies: @@ -549,12 +633,28 @@ packages: '@metaplex-foundation/cusper@0.0.2': resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} + '@metaplex-foundation/js@0.20.1': + resolution: {integrity: sha512-aqiLoEiToXdfI5pS+17/GN/dIO2D31gLoVQvEKDQi9XcnOPVhfJerXDmwgKbhp79OGoYxtlvVw+b2suacoUzGQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@metaplex-foundation/mpl-auction-house@2.5.1': resolution: {integrity: sha512-O+IAdYVaoOvgACB8pm+1lF5BNEjl0COkqny2Ho8KQZwka6aC/vHbZ239yRwAMtJhf5992BPFdT4oifjyE0O+Mw==} + '@metaplex-foundation/mpl-bubblegum@0.6.2': + resolution: {integrity: sha512-4tF7/FFSNtpozuIGD7gMKcqK2D49eVXZ144xiowC5H1iBeu009/oj2m8Tj6n4DpYFKWJ2JQhhhk0a2q7x0Begw==} + '@metaplex-foundation/mpl-bubblegum@0.7.0': resolution: {integrity: sha512-HCo6q+nh8M3KRv9/aUaZcJo5/vPJEeZwPGRDWkqN7lUXoMIvhd83fZi7MB1rIg1gwpVHfHqim0A02LCYKisWFg==} + '@metaplex-foundation/mpl-candy-guard@0.3.2': + resolution: {integrity: sha512-QWXzPDz+6OR3957LtfW6/rcGvFWS/0AeHJa/BUO2VEVQxN769dupsKGtrsS8o5RzXCeap3wrCtDSNxN3dnWu4Q==} + + '@metaplex-foundation/mpl-candy-machine-core@0.1.2': + resolution: {integrity: sha512-jjDkRvMR+iykt7guQ7qVnOHTZedql0lq3xqWDMaenAUCH3Xrf2zKATThhJppIVNX1/YtgBOO3lGqhaFbaI4pCw==} + + '@metaplex-foundation/mpl-candy-machine@5.1.0': + resolution: {integrity: sha512-pjHpUpWVOCDxK3l6dXxfmJKNQmbjBqnm5ElOl1mJAygnzO8NIPQvrP89y6xSNyo8qZsJyt4ZMYUyD0TdbtKZXQ==} + '@metaplex-foundation/mpl-core@1.1.1': resolution: {integrity: sha512-h1kLw+cGaV8SiykoHDb1/G01+VYqtJXAt0uGuO5+2Towsdtc6ET4M62iqUnh4EacTVMIW1yYHsKsG/LYWBCKaA==} peerDependencies: @@ -717,6 +817,9 @@ packages: '@noble/ed25519@1.7.3': resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + '@noble/hashes@1.1.3': + resolution: {integrity: sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==} + '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -750,6 +853,9 @@ packages: borsh: ^0.7.0 buffer: 6.0.1 + '@openbook-dex/openbook-v2@0.2.10': + resolution: {integrity: sha512-JOroVQHeia+RbghpluDJB5psUIhdhYRPLu0zWoG0h5vgDU4SjXwlcC+LJiIa2HVPasvZjWuCtlKWFyrOS75lOA==} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -778,15 +884,62 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@project-serum/anchor@0.11.1': + resolution: {integrity: sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==} + engines: {node: '>=11'} + '@project-serum/anchor@0.26.0': resolution: {integrity: sha512-Nq+COIjE1135T7qfnOHEn7E0q39bQTgXLFk837/rgFe6Hkew9WML7eHsS+lSYD2p3OJaTiUOHTAq1lHy36oIqQ==} engines: {node: '>=11'} + '@project-serum/borsh@0.2.5': + resolution: {integrity: sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.2.0 + + '@project-serum/serum@0.13.65': + resolution: {integrity: sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA==} + engines: {node: '>=10'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@pythnetwork/client@2.22.0': resolution: {integrity: sha512-Cyv23YqewKUL1pcm99jfmdetUa2aaUXjyRF9jvSeFcY895FddRu7uSWftYiaevsnx7vn4WbJgQR6ExxH+aONow==} peerDependencies: '@solana/web3.js': ^1.30.2 + '@pythnetwork/client@2.5.3': + resolution: {integrity: sha512-NBLxPnA6A3tZb/DYUooD4SO63UJ70s9DzzFPGXcQNBR9itcycp7aaV+UA5oUPloD/4UHL9soo2fRuDVur0gmhA==} + '@pythnetwork/hermes-client@1.3.0': resolution: {integrity: sha512-SneB+LJSD6pNnG2JUuAgbHNi1qFDcnrIiMuU60FQxZMtIWP09YFMR64vxWxVawyqR93t0iQHcV5HT/hhfmqYOQ==} @@ -794,9 +947,18 @@ packages: resolution: {integrity: sha512-SLm3IFcfmy9iMqHeT4Ih6qMNZhJEefY14T9yTlpsH2D/FE5+BaGGnfcexUifVlfH6M7mwRC4hEFdNvZ6ebZjJg==} deprecated: This package is deprecated and is no longer maintained. Please use @pythnetwork/hermes-client instead. + '@pythnetwork/price-service-sdk@1.7.1': + resolution: {integrity: sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ==} + '@pythnetwork/price-service-sdk@1.8.0': resolution: {integrity: sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==} + '@pythnetwork/pyth-solana-receiver@0.7.0': + resolution: {integrity: sha512-OoEAHh92RPRdKkfjkcKGrjC+t0F3SEL754iKFmixN9zyS8pIfZSVfFntmkHa9pWmqEMxdx/i925a8B5ny8Tuvg==} + + '@pythnetwork/solana-utils@0.4.3': + resolution: {integrity: sha512-aMiVPtye3H2XFWXV8Hlgyp+oHXsAdt6d2FG0xhdTGDWssTnL4e9r7I8XBcucKHQkMDUhLN1bNeNOZcSBVyp9mg==} + '@randlabs/communication-bridge@1.0.1': resolution: {integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==} @@ -824,6 +986,9 @@ packages: '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + '@scure/bip39@1.1.0': + resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} + '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} @@ -998,6 +1163,12 @@ packages: peerDependencies: '@solana/web3.js': ^1.88.0 + '@solana/spl-token@0.3.7': + resolution: {integrity: sha512-bKGxWTtIw6VDdCBngjtsGlKGLSmiu/8ghSt/IOYJV24BsymRbgq7r12GToeetpxmPaZYLddKwAz7+EwprLfkfg==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.47.4 + '@solana/spl-token@0.4.6': resolution: {integrity: sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==} engines: {node: '>=16'} @@ -1020,6 +1191,28 @@ packages: resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} engines: {node: '>=16'} + '@solana/wallet-adapter-base@0.9.23': + resolution: {integrity: sha512-apqMuYwFp1jFi55NxDfvXUX2x1T0Zh07MxhZ/nCCTGys5raSfYUh82zen2BLv8BSDj/JxZ2P/s7jrQZGrX8uAw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.77.3 + + '@solana/wallet-adapter-ledger@0.9.25': + resolution: {integrity: sha512-59yD3aveLwlzXqk4zBCaPLobeqAhmtMxPizfUBOjzwRKyepi1Nnnt9AC9Af3JrweU2x4qySRxAaZfU/iNqJ3rQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.77.3 + + '@solana/wallet-standard-features@1.2.0': + resolution: {integrity: sha512-tUd9srDLkRpe1BYg7we+c4UhRQkq+XQWswsr/L1xfGmoRDF47BPSXf4zE7ZU2GRBGvxtGt7lwJVAufQyQYhxTQ==} + engines: {node: '>=16'} + + '@solana/web3.js@1.77.4': + resolution: {integrity: sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q==} + + '@solana/web3.js@1.92.3': + resolution: {integrity: sha512-NVBWvb9zdJIAx6X+caXaIICCEQfQaQ8ygykCjJW4u2z/sIKcvPj3ZIIllnx0MWMc3IxGq15ozGYDOQIMbwUcHw==} + '@solana/web3.js@1.95.3': resolution: {integrity: sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==} @@ -1029,6 +1222,12 @@ packages: '@solana/web3.js@1.98.0': resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + '@solworks/soltoolkit-sdk@0.0.23': + resolution: {integrity: sha512-O6lXT3EBR4gmcjt0/33i97VMHVEImwXGi+4TNrDDdifn3tyOUB7V6PR1VGxlavQb9hqmVai3xhedg/rmbQzX7w==} + + '@soncodi/signal@2.0.7': + resolution: {integrity: sha512-zA2oZluZmVvgZEDjF243KWD1S2J+1SH1MVynI0O1KRgDt1lU8nqk7AK3oQfW/WpwT51L5waGSU0xKF/9BTP5Cw==} + '@supercharge/promise-pool@3.2.0': resolution: {integrity: sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==} engines: {node: '>=8'} @@ -1036,6 +1235,14 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@switchboard-xyz/common@2.5.12': + resolution: {integrity: sha512-D10cYwo0nMk8Y/jiz8hhyN0yhDIohdpXURVRF7E+co8qQ5a4kqs38yIKQFLkCyY4xlKHdTFNl91wWm2B8ZKCCg==} + engines: {node: '>=12'} + + '@switchboard-xyz/on-demand@1.2.42': + resolution: {integrity: sha512-Q2qMpBM95RIDhGWA5vqRrAySRYncWKa7QWpAwLaIu5xPZMlSqNo12+lX30fUnqTWVeIXey/rp/3n6yOJLBsjjA==} + engines: {node: '>= 18'} + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -1049,6 +1256,10 @@ packages: '@tiplink/api@0.3.1': resolution: {integrity: sha512-HjnXethjKOHTYT0IP1BewlMS7wZJ+hsoDgRa6jA1cNvxvwQjE1WHOyvOUPpAi+DJDw4P4/omFtyHr7dwLfnB/g==} + '@triton-one/yellowstone-grpc@1.3.0': + resolution: {integrity: sha512-tuwHtoYzvqnahsMrecfNNkQceCYwgiY0qKS8RwqtaxvDEgjm0E+0bXwKz2eUD3ZFYifomJmRKDmSBx9yQzAeMQ==} + engines: {node: '>=20.18.0'} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -1163,6 +1374,9 @@ packages: '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + '@types/w3c-web-usb@1.0.10': + resolution: {integrity: sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==} + '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} @@ -1219,6 +1433,14 @@ packages: '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@wallet-standard/base@1.1.0': + resolution: {integrity: sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==} + engines: {node: '>=16'} + + '@wallet-standard/features@1.1.0': + resolution: {integrity: sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==} + engines: {node: '>=16'} + '@zodios/core@10.9.6': resolution: {integrity: sha512-aH4rOdb3AcezN7ws8vDgBfGboZMk2JGGzEq/DtW65MhnRxyTGRuLJRWVQ/2KxDgWvV2F5oTkAS+5pnjKbl0n+A==} peerDependencies: @@ -1281,6 +1503,14 @@ packages: resolution: {integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==} engines: {node: '>=14.0.0'} + anchor-bankrun@0.3.0: + resolution: {integrity: sha512-PYBW5fWX+iGicIS5MIM/omhk1tQPUc0ELAnI/IkLKQJ6d75De/CQRh8MF2bU/TgGyFi6zEel80wUe3uRol9RrQ==} + engines: {node: '>= 10'} + peerDependencies: + '@coral-xyz/anchor': ^0.28.0 + '@solana/web3.js': ^1.78.4 + solana-bankrun: ^0.2.0 + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1312,6 +1542,14 @@ packages: ansicolors@0.3.2: resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + aptos@1.8.5: + resolution: {integrity: sha512-iQxliWesNHjGQ5YYXCyss9eg4+bDGQWqAZa73vprqGQ9tungK0cRjUI2fmnp63Ed6UG6rurHrL+b0ckbZAOZZQ==} + engines: {node: '>=11.0.0'} + deprecated: Package aptos is no longer supported, please migrate to https://www.npmjs.com/package/@aptos-labs/ts-sdk + + arbundles@0.10.1: + resolution: {integrity: sha512-QYFepxessLCirvRkQK9iQmjxjHz+s50lMNGRwZwpyPWLohuf6ISyj1gkFXJHlMT+rNSrsHxb532glHnKbjwu3A==} + arbundles@0.11.2: resolution: {integrity: sha512-vyX7vY6S8B4RFhGSoCixbnR/Z7ckpJjK+b/H7zcgRWJqqXjZqQ+3DQIJ19vKl5AvzNSsj5ja9kQDoZhMiGpBFw==} @@ -1359,6 +1597,9 @@ packages: axios-retry@3.9.1: resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} + axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + axios@0.28.1: resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==} @@ -1410,6 +1651,9 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + bip32-path@0.4.2: + resolution: {integrity: sha512-ZBMCELjJfcNMkz5bDuJ1WrYvjlhEF5k6mQ8vUr4N7MbVRsXei7ZOg8VhhwMfNiW68NWmLkgkc6WvTickrLGprQ==} + bip39-light@1.0.7: resolution: {integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==} @@ -1511,6 +1755,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -1543,6 +1791,9 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + cipher-base@1.0.6: resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} engines: {node: '>= 0.10'} @@ -1567,6 +1818,10 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} @@ -1574,6 +1829,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1595,6 +1854,10 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -1633,6 +1896,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cron-validator@1.3.1: + resolution: {integrity: sha512-C1HsxuPCY/5opR55G5/WNzyEGDWFVG+6GLrA+fW/sCTcP6A6NTjUP2AK7B8n2PyFs90kDG2qzwm8LMheADku6A==} + cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -1705,6 +1971,10 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1747,6 +2017,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1768,6 +2042,10 @@ packages: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -1840,6 +2118,10 @@ packages: es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1951,6 +2233,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + eventsource-parser@3.0.0: resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} engines: {node: '>=18.0.0'} @@ -1963,6 +2249,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -2044,6 +2334,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find@0.3.0: + resolution: {integrity: sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==} + flash-sdk@2.24.3: resolution: {integrity: sha512-3JdmHZksBgcRlCXVVFZEV64NGKxVHURHoHAMc3+Ev1BdN0Re2S44wxTaQmO6EIvwPYscVG0BPbp6GibpEuMdsw==} @@ -2077,6 +2370,10 @@ packages: form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} @@ -2097,6 +2394,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2106,6 +2406,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.3.0: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} @@ -2126,6 +2430,9 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2269,6 +2576,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} @@ -2379,6 +2689,9 @@ packages: engines: {node: '>=8'} hasBin: true + jito-ts@3.0.1: + resolution: {integrity: sha512-TSofF7KqcwyaWGjPaSYC8RDoNBY1TPRNBHdrw24bdIi7mQ5bFEDdYK3D//llw/ml8YDvcZlgd644WxhjLTS9yg==} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -2550,6 +2863,15 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -2568,6 +2890,9 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} @@ -2668,6 +2993,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2716,6 +3046,9 @@ packages: resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -2732,11 +3065,19 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + nanoid@3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2753,12 +3094,26 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.71.0: + resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + engines: {node: '>=10'} + node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-cache@5.1.2: + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -2780,6 +3135,11 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-hid@2.1.2: + resolution: {integrity: sha512-qhCyQqrPpP93F/6Wc/xUR7L8mAJW0Z6R7HMQV8jCHHksAxNDe/4z4Un/H9CpLOT+5K39OPyt9tIQlavxWES3lg==} + engines: {node: '>=10'} + hasBin: true + normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -2956,6 +3316,11 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2985,6 +3350,10 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3025,6 +3394,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -3045,6 +3418,10 @@ packages: regex@5.1.1: resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -3095,6 +3472,12 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + rpc-websockets@7.5.1: + resolution: {integrity: sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==} + + rpc-websockets@8.0.2: + resolution: {integrity: sha512-QZ8lneJTtIZTf9JBcdUn/im2qDynWRYPKtmF6P9DqtdzqSLebcllYWVQr5aQacAp7LBYPReOW9Ses98dNfO7cA==} + rpc-websockets@9.0.4: resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} @@ -3105,6 +3488,10 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -3190,6 +3577,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -3209,6 +3602,39 @@ packages: peerDependencies: sodium-native: ^3.2.0 + solana-bankrun-darwin-arm64@0.3.1: + resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + solana-bankrun-darwin-universal@0.3.1: + resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} + engines: {node: '>= 10'} + os: [darwin] + + solana-bankrun-darwin-x64@0.3.1: + resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + solana-bankrun-linux-x64-gnu@0.3.1: + resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + solana-bankrun-linux-x64-musl@0.3.1: + resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + solana-bankrun@0.3.1: + resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} + engines: {node: '>= 10'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -3226,6 +3652,9 @@ packages: stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + strict-event-emitter-types@2.0.0: + resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3268,13 +3697,24 @@ packages: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + superstruct@0.14.2: + resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} + superstruct@0.15.5: resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + superstruct@2.0.2: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} @@ -3292,6 +3732,13 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -3342,6 +3789,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + traverse-chain@0.1.0: + resolution: {integrity: sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==} + treeify@1.1.0: resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} engines: {node: '>=0.6'} @@ -3376,9 +3826,15 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tweetnacl-util@0.15.1: resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} @@ -3426,6 +3882,11 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -3476,6 +3937,10 @@ packages: resolution: {integrity: sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==} engines: {node: '>=6.0.0'} + usb@2.9.0: + resolution: {integrity: sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw==} + engines: {node: '>=10.20.0 <11.x || >=12.17.0 <13.0 || >=14.0.0'} + use-sync-external-store@1.4.0: resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: @@ -3618,6 +4083,10 @@ packages: xsalsa20@1.2.0: resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yaml@2.6.1: resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} @@ -3628,6 +4097,14 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -3647,6 +4124,9 @@ packages: zstddec@0.0.2: resolution: {integrity: sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA==} + zstddec@0.1.0: + resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3776,6 +4256,10 @@ snapshots: - typescript - utf-8-validate + '@brokerloop/ttlcache@3.2.3': + dependencies: + '@soncodi/signal': 2.0.7 + '@cfworker/json-schema@4.0.3': {} '@cks-systems/manifest-sdk@0.1.59(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': @@ -3807,6 +4291,8 @@ snapshots: - typescript - utf-8-validate + '@coral-xyz/anchor-errors@0.30.1': {} + '@coral-xyz/anchor@0.26.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/borsh': 0.26.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -3851,6 +4337,28 @@ snapshots: - encoding - utf-8-validate + '@coral-xyz/anchor@0.28.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + base64-js: 1.5.1 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + js-sha256: 0.9.0 + 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/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -3872,6 +4380,28 @@ snapshots: - encoding - utf-8-validate + '@coral-xyz/anchor@0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor-errors': 0.30.1 + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.7.0 + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(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.2.0 + 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.26.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -3890,6 +4420,12 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 + '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -3906,6 +4442,147 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@drift-labs/sdk@2.107.0-beta.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/anchor-30': '@coral-xyz/anchor@0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)' + '@ellipsis-labs/phoenix-sdk': 1.4.5(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@grpc/grpc-js': 1.12.5 + '@openbook-dex/openbook-v2': 0.2.10(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@project-serum/serum': 0.13.65(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@pythnetwork/client': 2.5.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@pythnetwork/price-service-sdk': 1.7.1 + '@pythnetwork/pyth-solana-receiver': 0.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.7(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@switchboard-xyz/on-demand': 1.2.42(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) + '@triton-one/yellowstone-grpc': 1.3.0 + anchor-bankrun: 0.3.0(@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solana-bankrun@0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + nanoid: 3.3.4 + node-cache: 5.1.2 + rpc-websockets: 7.5.1 + solana-bankrun: 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + strict-event-emitter-types: 2.0.0 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + uuid: 8.3.2 + yargs: 17.7.2 + zstddec: 0.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - jiti + - supports-color + - typescript + - utf-8-validate + + '@drift-labs/sdk@2.107.0-beta.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/anchor-30': '@coral-xyz/anchor@0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)' + '@ellipsis-labs/phoenix-sdk': 1.4.5(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@grpc/grpc-js': 1.12.5 + '@openbook-dex/openbook-v2': 0.2.10(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@project-serum/serum': 0.13.65(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@pythnetwork/client': 2.5.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@pythnetwork/price-service-sdk': 1.7.1 + '@pythnetwork/pyth-solana-receiver': 0.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.7(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@switchboard-xyz/on-demand': 1.2.42(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) + '@triton-one/yellowstone-grpc': 1.3.0 + anchor-bankrun: 0.3.0(@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solana-bankrun@0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + nanoid: 3.3.4 + node-cache: 5.1.2 + rpc-websockets: 7.5.1 + solana-bankrun: 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + strict-event-emitter-types: 2.0.0 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + uuid: 8.3.2 + yargs: 17.7.2 + zstddec: 0.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - jiti + - supports-color + - typescript + - utf-8-validate + + '@drift-labs/vaults-sdk@0.2.46(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.28.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@drift-labs/sdk': 2.107.0-beta.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@ledgerhq/hw-app-solana': 7.2.4 + '@ledgerhq/hw-transport': 6.31.4 + '@ledgerhq/hw-transport-node-hid': 6.29.5 + '@metaplex-foundation/js': 0.20.1(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-ledger': 0.9.25(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + commander: 11.1.0 + dotenv: 16.4.5 + rpc-websockets: 7.5.1 + strict-event-emitter-types: 2.0.0 + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - arweave + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - jiti + - supports-color + - utf-8-validate + + '@ellipsis-labs/phoenix-sdk@1.4.5(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/rustbin': 0.3.5 + '@metaplex-foundation/solita': 0.12.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@types/node': 18.19.69 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 5.0.0 + transitivePeerDependencies: + - '@solana/web3.js' + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - jiti + - supports-color + - typescript + - utf-8-validate + + '@ellipsis-labs/phoenix-sdk@1.4.5(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/rustbin': 0.3.5 + '@metaplex-foundation/solita': 0.12.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@types/node': 18.19.69 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 5.0.0 + transitivePeerDependencies: + - '@solana/web3.js' + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - jiti + - supports-color + - typescript + - utf-8-validate + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -4222,6 +4899,18 @@ snapshots: '@shikijs/types': 1.26.1 '@shikijs/vscode-textmate': 10.0.1 + '@grpc/grpc-js@1.12.5': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -4245,23 +4934,64 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@irys/arweave@0.0.2': + '@irys/arweave@0.0.2(debug@4.4.0)': dependencies: asn1.js: 5.4.1 async-retry: 1.3.3 - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) base64-js: 1.5.1 bignumber.js: 9.1.2 transitivePeerDependencies: - debug + '@irys/query@0.0.1(debug@4.4.0)': + dependencies: + async-retry: 1.3.3 + axios: 1.7.9(debug@4.4.0) + transitivePeerDependencies: + - debug + '@irys/query@0.0.8': dependencies: async-retry: 1.3.3 - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) transitivePeerDependencies: - debug + '@irys/sdk@0.0.2(arweave@1.15.5)(bufferutil@4.0.9)(debug@4.4.0)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@ethersproject/wallet': 5.7.0 + '@irys/query': 0.0.1(debug@4.4.0) + '@near-js/crypto': 0.0.3 + '@near-js/keystores-browser': 0.0.3 + '@near-js/providers': 0.0.4 + '@near-js/transactions': 0.1.1 + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@supercharge/promise-pool': 3.2.0 + algosdk: 1.24.1 + aptos: 1.8.5(debug@4.4.0) + arbundles: 0.10.1(arweave@1.15.5)(bufferutil@4.0.9)(debug@4.4.0)(utf-8-validate@5.0.10) + async-retry: 1.3.3 + axios: 1.7.9(debug@4.4.0) + base64url: 3.0.1 + bignumber.js: 9.1.2 + bs58: 5.0.0 + commander: 8.3.0 + csv: 5.5.3 + inquirer: 8.2.6 + js-sha256: 0.9.0 + mime-types: 2.1.35 + near-seed-phrase: 0.2.1 + transitivePeerDependencies: + - arweave + - bufferutil + - debug + - encoding + - utf-8-validate + '@irys/sdk@0.2.11(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@aptos-labs/ts-sdk': 1.33.1 @@ -4279,7 +5009,7 @@ snapshots: algosdk: 1.24.1 arbundles: 0.11.2(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10) async-retry: 1.3.3 - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) base64url: 3.0.1 bignumber.js: 9.1.2 bs58: 5.0.0 @@ -4315,6 +5045,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-sdsl/ordered-map@4.4.2': {} + '@langchain/core@0.3.27(openai@4.77.3(zod@3.24.1))': dependencies: '@cfworker/json-schema': 4.0.3 @@ -4377,6 +5109,69 @@ snapshots: '@langchain/core': 0.3.27(openai@4.77.3(zod@3.24.1)) js-tiktoken: 1.0.16 + '@ledgerhq/devices@6.27.1': + dependencies: + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/logs': 6.12.0 + rxjs: 6.6.7 + semver: 7.6.3 + + '@ledgerhq/devices@8.4.4': + dependencies: + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/logs': 6.12.0 + rxjs: 7.8.1 + semver: 7.6.3 + + '@ledgerhq/errors@6.19.1': {} + + '@ledgerhq/hw-app-solana@7.2.4': + dependencies: + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/hw-transport': 6.31.4 + bip32-path: 0.4.2 + + '@ledgerhq/hw-transport-node-hid-noevents@6.30.5': + dependencies: + '@ledgerhq/devices': 8.4.4 + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/hw-transport': 6.31.4 + '@ledgerhq/logs': 6.12.0 + node-hid: 2.1.2 + + '@ledgerhq/hw-transport-node-hid@6.29.5': + dependencies: + '@ledgerhq/devices': 8.4.4 + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/hw-transport': 6.31.4 + '@ledgerhq/hw-transport-node-hid-noevents': 6.30.5 + '@ledgerhq/logs': 6.12.0 + lodash: 4.17.21 + node-hid: 2.1.2 + usb: 2.9.0 + + '@ledgerhq/hw-transport-webhid@6.27.1': + dependencies: + '@ledgerhq/devices': 6.27.1 + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/hw-transport': 6.31.4 + '@ledgerhq/logs': 6.12.0 + + '@ledgerhq/hw-transport@6.27.1': + dependencies: + '@ledgerhq/devices': 6.27.1 + '@ledgerhq/errors': 6.19.1 + events: 3.3.0 + + '@ledgerhq/hw-transport@6.31.4': + dependencies: + '@ledgerhq/devices': 8.4.4 + '@ledgerhq/errors': 6.19.1 + '@ledgerhq/logs': 6.12.0 + events: 3.3.0 + + '@ledgerhq/logs@6.12.0': {} + '@lightprotocol/compressed-token@0.17.1(@lightprotocol/stateless.js@0.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -4476,6 +5271,57 @@ snapshots: '@metaplex-foundation/cusper@0.0.2': {} + '@metaplex-foundation/js@0.20.1(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@irys/sdk': 0.0.2(arweave@1.15.5)(bufferutil@4.0.9)(debug@4.4.0)(utf-8-validate@5.0.10) + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/mpl-auction-house': 2.5.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-bubblegum': 0.6.2(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-candy-guard': 0.3.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-candy-machine': 5.1.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-candy-machine-core': 0.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@noble/ed25519': 1.7.3 + '@noble/hashes': 1.7.0 + '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bignumber.js: 9.1.2 + bn.js: 5.2.1 + bs58: 5.0.0 + buffer: 6.0.3 + debug: 4.4.0 + eventemitter3: 4.0.7 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + merkletreejs: 0.3.11 + mime: 3.0.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - arweave + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + + '@metaplex-foundation/mpl-auction-house@2.5.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.6.1 + '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + '@metaplex-foundation/mpl-auction-house@2.5.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.6.1 @@ -4492,6 +5338,25 @@ snapshots: - typescript - utf-8-validate + '@metaplex-foundation/mpl-bubblegum@0.6.2(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet-solana': 0.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.1.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + js-sha3: 0.8.0 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + '@metaplex-foundation/mpl-bubblegum@0.7.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.7.1 @@ -4510,12 +5375,70 @@ snapshots: - typescript - utf-8-validate + '@metaplex-foundation/mpl-candy-guard@0.3.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.4.0 + '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metaplex-foundation/mpl-candy-machine-core@0.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.4.0 + '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metaplex-foundation/mpl-candy-machine@5.1.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + '@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.7.0)': dependencies: '@metaplex-foundation/umi': 0.9.2 '@msgpack/msgpack': 3.0.0-beta2 '@noble/hashes': 1.7.0 + '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet-solana': 0.4.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + debug: 4.4.0 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.7.1 @@ -4773,6 +5696,8 @@ snapshots: '@noble/ed25519@1.7.3': {} + '@noble/hashes@1.1.3': {} + '@noble/hashes@1.4.0': {} '@noble/hashes@1.5.0': {} @@ -4805,6 +5730,32 @@ snapshots: - supports-color - utf-8-validate + '@openbook-dex/openbook-v2@0.2.10(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + big.js: 6.2.2 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@openbook-dex/openbook-v2@0.2.10(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + big.js: 6.2.2 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + '@opentelemetry/api@1.9.0': {} '@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(decimal.js@10.4.3)': @@ -4828,6 +5779,27 @@ snapshots: '@pkgr/core@0.1.1': {} + '@project-serum/anchor@0.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@project-serum/borsh': 0.2.5(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + base64-js: 1.5.1 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 5.3.1 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + find: 0.3.0 + js-sha256: 0.9.0 + pako: 2.1.0 + snake-case: 3.0.4 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@project-serum/anchor@0.26.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/borsh': 0.26.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -4850,6 +5822,47 @@ snapshots: - encoding - utf-8-validate + '@project-serum/borsh@0.2.5(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + + '@project-serum/serum@0.13.65(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@project-serum/anchor': 0.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.1.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@pythnetwork/client@2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -4861,6 +5874,16 @@ snapshots: - encoding - utf-8-validate + '@pythnetwork/client@2.5.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + assert: 2.1.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@pythnetwork/hermes-client@1.3.0(axios@1.7.9)': dependencies: '@zodios/core': 10.9.6(axios@1.7.9)(zod@3.24.1) @@ -4873,7 +5896,7 @@ snapshots: dependencies: '@pythnetwork/price-service-sdk': 1.8.0 '@types/ws': 8.5.13 - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) axios-retry: 3.9.1 isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ts-log: 2.2.7 @@ -4883,10 +5906,37 @@ snapshots: - debug - utf-8-validate + '@pythnetwork/price-service-sdk@1.7.1': + dependencies: + bn.js: 5.2.1 + '@pythnetwork/price-service-sdk@1.8.0': dependencies: bn.js: 5.2.1 + '@pythnetwork/pyth-solana-receiver@0.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@noble/hashes': 1.7.0 + '@pythnetwork/price-service-sdk': 1.8.0 + '@pythnetwork/solana-utils': 0.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@pythnetwork/solana-utils@0.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bs58: 5.0.0 + jito-ts: 3.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@randlabs/communication-bridge@1.0.1': optional: true @@ -4900,7 +5950,7 @@ snapshots: '@solana/buffer-layout': 4.0.1 '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) big.js: 6.2.2 bn.js: 5.2.1 dayjs: 1.11.13 @@ -4944,6 +5994,11 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 + '@scure/bip39@1.1.0': + dependencies: + '@noble/hashes': 1.1.3 + '@scure/base': 1.1.9 + '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.4.0 @@ -5015,6 +6070,11 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) typescript: 4.9.5 + '@solana/codecs-core@2.0.0-rc.1(typescript@5.6.3)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) + typescript: 5.6.3 + '@solana/codecs-core@2.0.0-rc.1(typescript@5.7.2)': dependencies: '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) @@ -5040,6 +6100,13 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) typescript: 4.9.5 + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.6.3)': + 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 + '@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) @@ -5064,6 +6131,12 @@ snapshots: '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) typescript: 4.9.5 + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.6.3)': + 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 + '@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) @@ -5093,6 +6166,14 @@ snapshots: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 4.9.5 + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + 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 + '@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) @@ -5133,6 +6214,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + 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 + '@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) @@ -5161,6 +6253,12 @@ snapshots: commander: 12.1.0 typescript: 4.9.5 + '@solana/errors@2.0.0-rc.1(typescript@5.6.3)': + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + typescript: 5.6.3 + '@solana/errors@2.0.0-rc.1(typescript@5.7.2)': dependencies: chalk: 5.4.1 @@ -5194,6 +6292,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + 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 + '@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) @@ -5237,6 +6346,14 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(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.9)(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) @@ -5245,6 +6362,22 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.92.3(bufferutil@4.0.9)(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.92.3(bufferutil@4.0.9)(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.9)(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) @@ -5269,6 +6402,14 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(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.9)(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) @@ -5290,6 +6431,34 @@ snapshots: - encoding - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-token@0.3.11(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(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.9)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -5318,6 +6487,20 @@ snapshots: - typescript - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -5332,6 +6515,17 @@ snapshots: - typescript - utf-8-validate + '@solana/spl-token@0.3.7(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@solana/spl-token@0.4.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -5362,6 +6556,21 @@ snapshots: - typescript - utf-8-validate + '@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(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.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -5381,6 +6590,72 @@ snapshots: dependencies: buffer: 6.0.3 + '@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/wallet-standard-features': 1.2.0 + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + eventemitter3: 4.0.7 + + '@solana/wallet-adapter-ledger@0.9.25(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@ledgerhq/devices': 6.27.1 + '@ledgerhq/hw-transport': 6.27.1 + '@ledgerhq/hw-transport-webhid': 6.27.1 + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + + '@solana/wallet-standard-features@1.2.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@wallet-standard/features': 1.1.0 + + '@solana/web3.js@1.77.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.6.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.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 7.5.1 + superstruct: 0.14.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.6.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.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 8.0.2 + superstruct: 1.0.4 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@solana/web3.js@1.95.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.26.0 @@ -5447,12 +6722,69 @@ snapshots: - encoding - utf-8-validate + '@solworks/soltoolkit-sdk@0.0.23(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@types/bn.js': 5.1.6 + '@types/node': 18.19.69 + '@types/node-fetch': 2.6.12 + bn.js: 5.2.1 + decimal.js: 10.4.3 + typescript: 4.9.5 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@soncodi/signal@2.0.7': {} + '@supercharge/promise-pool@3.2.0': {} '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@switchboard-xyz/common@2.5.12(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + axios: 1.7.9(debug@4.4.0) + big.js: 6.2.2 + bn.js: 5.2.1 + bs58: 6.0.0 + cron-validator: 1.3.1 + decimal.js: 10.4.3 + js-sha256: 0.11.0 + lodash: 4.17.21 + protobufjs: 7.4.0 + yaml: 2.7.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@switchboard-xyz/on-demand@1.2.42(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)': + dependencies: + '@brokerloop/ttlcache': 3.2.3 + '@coral-xyz/anchor-30': '@coral-xyz/anchor@0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)' + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solworks/soltoolkit-sdk': 0.0.23(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) + '@switchboard-xyz/common': 2.5.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) + axios: 1.7.9(debug@4.4.0) + big.js: 6.2.2 + bs58: 5.0.0 + js-yaml: 4.1.0 + protobufjs: 7.4.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - utf-8-validate + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 @@ -5527,6 +6859,10 @@ snapshots: - sodium-native - utf-8-validate + '@triton-one/yellowstone-grpc@1.3.0': + dependencies: + '@grpc/grpc-js': 1.12.5 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -5653,6 +6989,8 @@ snapshots: '@types/uuid@8.3.4': {} + '@types/w3c-web-usb@1.0.10': {} + '@types/ws@7.4.7': dependencies: '@types/node': 22.10.5 @@ -5740,9 +7078,15 @@ snapshots: '@ungap/structured-clone@1.2.1': {} + '@wallet-standard/base@1.1.0': {} + + '@wallet-standard/features@1.1.0': + dependencies: + '@wallet-standard/base': 1.1.0 + '@zodios/core@10.9.6(axios@1.7.9)(zod@3.24.1)': dependencies: - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) zod: 3.24.1 JSONStream@1.3.5: @@ -5812,6 +7156,12 @@ snapshots: transitivePeerDependencies: - encoding + anchor-bankrun@0.3.0(@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solana-bankrun@0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + solana-bankrun: 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -5834,6 +7184,43 @@ snapshots: ansicolors@0.3.2: {} + aptos@1.8.5(debug@4.4.0): + dependencies: + '@noble/hashes': 1.1.3 + '@scure/bip39': 1.1.0 + axios: 0.27.2(debug@4.4.0) + form-data: 4.0.0 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - debug + + arbundles@0.10.1(arweave@1.15.5)(bufferutil@4.0.9)(debug@4.4.0)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@irys/arweave': 0.0.2(debug@4.4.0) + '@noble/ed25519': 1.7.3 + base64url: 3.0.1 + bs58: 4.0.1 + keccak: 3.0.4 + secp256k1: 5.0.1 + optionalDependencies: + '@randlabs/myalgo-connect': 1.4.2 + algosdk: 1.24.1 + arweave-stream-tx: 1.2.2(arweave@1.15.5) + multistream: 4.1.0 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - arweave + - bufferutil + - debug + - encoding + - utf-8-validate + arbundles@0.11.2(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@ethersproject/bytes': 5.7.0 @@ -5842,7 +7229,7 @@ snapshots: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 - '@irys/arweave': 0.0.2 + '@irys/arweave': 0.0.2(debug@4.4.0) '@noble/ed25519': 1.7.3 base64url: 3.0.1 bs58: 4.0.1 @@ -5918,9 +7305,16 @@ snapshots: '@babel/runtime': 7.26.0 is-retry-allowed: 2.2.0 + axios@0.27.2(debug@4.4.0): + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.1 + transitivePeerDependencies: + - debug + axios@0.28.1: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -5928,15 +7322,15 @@ snapshots: axios@1.7.4: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.7.9: + axios@1.7.9(debug@4.4.0): dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -5974,6 +7368,8 @@ snapshots: bintrees@1.0.2: {} + bip32-path@0.4.2: {} + bip39-light@1.0.7: dependencies: create-hash: 1.2.0 @@ -6106,6 +7502,8 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + camelcase@6.3.0: {} ccount@2.0.1: {} @@ -6133,6 +7531,8 @@ snapshots: check-error@2.1.1: {} + chownr@1.1.4: {} + cipher-base@1.0.6: dependencies: inherits: 2.0.4 @@ -6155,12 +7555,20 @@ snapshots: cli-width@3.0.0: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clone-response@1.0.3: dependencies: mimic-response: 1.0.1 clone@1.0.4: {} + clone@2.1.2: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -6177,6 +7585,8 @@ snapshots: commander@10.0.1: {} + commander@11.1.0: {} + commander@12.1.0: {} commander@2.20.3: {} @@ -6214,6 +7624,8 @@ snapshots: create-require@1.1.1: {} + cron-validator@1.3.1: {} + cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 @@ -6269,6 +7681,8 @@ snapshots: deep-eql@5.0.2: {} + deep-extend@0.6.0: {} + deep-is@0.1.4: {} defaults@1.0.4: @@ -6301,6 +7715,8 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.0.3: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -6320,6 +7736,8 @@ snapshots: dotenv@10.0.0: {} + dotenv@16.4.5: {} + dotenv@16.4.7: {} dunder-proto@1.0.1: @@ -6388,6 +7806,8 @@ snapshots: dependencies: es6-promise: 4.2.8 + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -6551,6 +7971,8 @@ snapshots: eventemitter3@5.0.1: {} + events@3.3.0: {} + eventsource-parser@3.0.0: {} eventsource@2.0.2: {} @@ -6567,6 +7989,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expand-template@2.0.3: {} + exponential-backoff@3.1.1: {} express-prom-bundle@7.0.2(prom-client@15.1.3): @@ -6700,6 +8124,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find@0.3.0: + dependencies: + traverse-chain: 0.1.0 + flash-sdk@2.24.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10): dependencies: '@coral-xyz/anchor': 0.27.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -6741,7 +8169,9 @@ snapshots: flatted@3.3.2: {} - follow-redirects@1.15.9: {} + follow-redirects@1.15.9(debug@4.4.0): + optionalDependencies: + debug: 4.4.0 for-each@0.3.3: dependencies: @@ -6754,6 +8184,12 @@ snapshots: form-data-encoder@1.7.2: {} + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + form-data@4.0.1: dependencies: asynckit: 0.4.0 @@ -6773,12 +8209,16 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + fs.realpath@1.0.0: {} fs@0.0.1-security: {} function-bind@1.1.2: {} + get-caller-file@2.0.5: {} + get-east-asian-width@1.3.0: {} get-intrinsic@1.2.7: @@ -6805,6 +8245,8 @@ snapshots: get-stream@8.0.1: {} + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6993,6 +8435,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 @@ -7115,6 +8559,21 @@ snapshots: - bufferutil - utf-8-validate + jito-ts@3.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@grpc/grpc-js': 1.12.5 + '@noble/ed25519': 1.7.3 + '@solana/web3.js': 1.77.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + agentkeepalive: 4.6.0 + dotenv: 16.4.7 + jayson: 4.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + superstruct: 1.0.4 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + js-base64@3.7.7: {} js-sha256@0.11.0: {} @@ -7202,7 +8661,7 @@ snapshots: zod-to-json-schema: 3.24.1(zod@3.24.1) optionalDependencies: '@langchain/groq': 0.1.2(@langchain/core@0.3.27(openai@4.77.3(zod@3.24.1))) - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) transitivePeerDependencies: - encoding - openai @@ -7269,6 +8728,12 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.isequal@4.5.0: {} + lodash.merge@4.6.2: {} lodash@4.17.21: {} @@ -7288,6 +8753,8 @@ snapshots: loglevel@1.9.2: {} + long@5.2.3: {} + loupe@3.1.2: {} lower-case@2.0.2: @@ -7387,6 +8854,8 @@ snapshots: mime@1.6.0: {} + mime@3.0.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -7419,6 +8888,8 @@ snapshots: mixme@0.5.10: {} + mkdirp-classic@0.5.3: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -7433,8 +8904,12 @@ snapshots: mute-stream@0.0.8: {} + nanoid@3.3.4: {} + nanoid@3.3.8: {} + napi-build-utils@1.0.2: {} + natural-compare@1.4.0: {} near-hd-key@1.2.1: @@ -7457,10 +8932,22 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-abi@3.71.0: + dependencies: + semver: 7.6.3 + node-addon-api@2.0.2: {} + node-addon-api@3.2.1: {} + node-addon-api@5.1.0: {} + node-addon-api@6.1.0: {} + + node-cache@5.1.2: + dependencies: + clone: 2.1.2 + node-domexception@1.0.0: {} node-fetch@2.7.0: @@ -7475,6 +8962,12 @@ snapshots: node-gyp-build@4.8.4: {} + node-hid@2.1.2: + dependencies: + bindings: 1.5.0 + node-addon-api: 3.2.1 + prebuild-install: 7.1.2 + normalize-url@6.1.0: {} npm-run-path@5.3.0: @@ -7651,6 +9144,21 @@ snapshots: possible-typed-array-names@1.0.0: {} + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.71.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -7673,6 +9181,21 @@ snapshots: property-information@6.5.0: {} + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.10.5 + long: 5.2.3 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -7710,6 +9233,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + react@19.0.0: {} readable-stream@3.6.2: @@ -7731,6 +9261,8 @@ snapshots: dependencies: regex-utilities: 2.3.0 + require-directory@2.1.1: {} + resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} @@ -7775,6 +9307,25 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 + rpc-websockets@7.5.1: + dependencies: + '@babel/runtime': 7.26.0 + eventemitter3: 4.0.7 + uuid: 8.3.2 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + + rpc-websockets@8.0.2: + dependencies: + eventemitter3: 4.0.7 + uuid: 8.3.2 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + rpc-websockets@9.0.4: dependencies: '@swc/helpers': 0.5.15 @@ -7794,6 +9345,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@6.6.7: + dependencies: + tslib: 1.14.1 + rxjs@7.8.1: dependencies: tslib: 2.8.1 @@ -7914,6 +9469,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -7942,6 +9505,36 @@ snapshots: typedarray-to-buffer: 3.1.5 xsalsa20: 1.2.0 + solana-bankrun-darwin-arm64@0.3.1: + optional: true + + solana-bankrun-darwin-universal@0.3.1: + optional: true + + solana-bankrun-darwin-x64@0.3.1: + optional: true + + solana-bankrun-linux-x64-gnu@0.3.1: + optional: true + + solana-bankrun-linux-x64-musl@0.3.1: + optional: true + + solana-bankrun@0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bs58: 4.0.1 + optionalDependencies: + solana-bankrun-darwin-arm64: 0.3.1 + solana-bankrun-darwin-universal: 0.3.1 + solana-bankrun-darwin-x64: 0.3.1 + solana-bankrun-linux-x64-gnu: 0.3.1 + solana-bankrun-linux-x64-musl: 0.3.1 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + space-separated-tokens@2.0.2: {} spok@1.5.5: @@ -7960,6 +9553,8 @@ snapshots: dependencies: mixme: 0.5.10 + strict-event-emitter-types@2.0.0: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -8005,10 +9600,16 @@ snapshots: dependencies: is-hex-prefixed: 1.0.0 + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} + superstruct@0.14.2: {} + superstruct@0.15.5: {} + superstruct@1.0.4: {} + superstruct@2.0.2: {} supports-color@7.2.0: @@ -8026,6 +9627,21 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + tdigest@0.1.2: dependencies: bintrees: 1.0.2 @@ -8066,6 +9682,8 @@ snapshots: tr46@0.0.3: {} + traverse-chain@0.1.0: {} + treeify@1.1.0: {} trim-lines@3.0.1: {} @@ -8094,6 +9712,24 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.6.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.10.5 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -8118,8 +9754,14 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tslib@1.14.1: {} + tslib@2.8.1: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + tweetnacl-util@0.15.1: {} tweetnacl@1.0.3: {} @@ -8163,6 +9805,8 @@ snapshots: typescript@4.9.5: {} + typescript@5.6.3: {} + typescript@5.7.2: {} uc.micro@2.1.0: {} @@ -8211,6 +9855,12 @@ snapshots: url-value-parser@2.2.0: {} + usb@2.9.0: + dependencies: + '@types/w3c-web-usb': 1.0.10 + node-addon-api: 6.1.0 + node-gyp-build: 4.8.4 + use-sync-external-store@1.4.0(react@19.0.0): dependencies: react: 19.0.0 @@ -8340,10 +9990,24 @@ snapshots: xsalsa20@1.2.0: {} + y18n@5.0.8: {} + yaml@2.6.1: {} yaml@2.7.0: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -8356,4 +10020,6 @@ snapshots: zstddec@0.0.2: {} + zstddec@0.1.0: {} + zwitch@2.0.4: {} diff --git a/src/tools/drift_vault.ts b/src/tools/drift_vault.ts new file mode 100644 index 0000000..6d70bf3 --- /dev/null +++ b/src/tools/drift_vault.ts @@ -0,0 +1,507 @@ +import { + BASE_PRECISION, + convertToNumber, + DriftClient, + FastSingleTxSender, + getLimitOrderParams, + getMarketOrderParams, + getOrderParams, + MarketType, + numberToSafeBN, + PERCENTAGE_PRECISION, + PositionDirection, + PostOnlyParams, + PRICE_PRECISION, + QUOTE_PRECISION, + TEN, + type IWallet, +} from "@drift-labs/sdk"; +import { + VAULT_PROGRAM_ID, + VaultClient, + IDL, + WithdrawUnit, + encodeName, + getVaultDepositorAddressSync, +} from "@drift-labs/vaults-sdk"; +import * as anchor from "@coral-xyz/anchor"; +import { + ComputeBudgetProgram, + PublicKey, + type TransactionInstruction, +} from "@solana/web3.js"; +import type { SolanaAgentKit } from "../agent"; +import { BN } from "bn.js"; + +function initClients(agent: SolanaAgentKit) { + const wallet: IWallet = { + publicKey: agent.wallet.publicKey, + payer: agent.wallet, + signAllTransactions: async (txs) => { + for (const tx of txs) { + tx.sign(agent.wallet); + } + return txs; + }, + signTransaction: async (tx) => { + tx.sign(agent.wallet); + return tx; + }, + }; + + const driftClient = new DriftClient({ + connection: agent.connection, + wallet, + env: "mainnet-beta", + txSender: new FastSingleTxSender({ + connection: agent.connection, + wallet, + timeout: 30000, + blockhashRefreshInterval: 1000, + opts: { + commitment: agent.connection.commitment ?? "confirmed", + skipPreflight: false, + preflightCommitment: agent.connection.commitment ?? "confirmed", + }, + }), + }); + const vaultProgram = new anchor.Program( + IDL, + VAULT_PROGRAM_ID, + driftClient.provider, + ); + const vaultClient = new VaultClient({ + driftClient, + // @ts-expect-error - type mismatch due to different dep versions + program: vaultProgram, + cliMode: false, + }); + + return { driftClient, vaultClient }; +} + +async function getOrCreateVaultDepositor(agent: SolanaAgentKit, vault: string) { + const { vaultClient } = initClients(agent); + const vaultPublicKey = new PublicKey(vault); + const vaultDepositor = getVaultDepositorAddressSync( + vaultClient.program.programId, + vaultPublicKey, + agent.wallet.publicKey, + ); + + try { + await vaultClient.getVaultDepositor(vaultDepositor); + return vaultDepositor; + } catch (e) { + // @ts-expect-error - error message is a string + if (e.message === "Account not found") { + await vaultClient.initializeVaultDepositor(vaultDepositor); + } + return vaultDepositor; + } +} + +/** + Create a vault + @param agent SolanaAgentKit instance + @param params Vault creation parameters + @param params.name Name of the vault (must be unique) + @param params.marketName Market name of the vault (e.g. "USDC-SPOT") + @param params.redeemPeriod Redeem period in seconds + @param params.maxTokens Maximum amount that can be deposited into the vault (in tokens) + @param params.minDepositAmount Minimum amount that can be deposited into the vault (in tokens) + @param params.managementFee Management fee percentage (e.g 2 == 2%) + @param params.profitShare Profit share percentage (e.g 20 == 20%) + @param params.hurdleRate Hurdle rate percentage + @param params.permissioned Whether the vault uses a whitelist + @returns Promise - The transaction signature of the vault creation +*/ +export async function createVault( + agent: SolanaAgentKit, + params: { + name: string; + marketName: `${string}-${string}`; + redeemPeriod: number; + maxTokens: number; + minDepositAmount: number; + managementFee: number; + profitShare: number; + hurdleRate?: number; + permissioned?: boolean; + }, +) { + try { + const { vaultClient, driftClient } = initClients(agent); + const marketIndexAndType = driftClient.getMarketIndexAndType( + params.marketName, + ); + + if (!marketIndexAndType) { + throw new Error("Invalid market name"); + } + + const spotMarket = driftClient.getSpotMarketAccount( + marketIndexAndType.marketIndex, + ); + + if (!spotMarket) { + throw new Error("Market not found"); + } + + const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); + + if (marketIndexAndType.marketType === MarketType.PERP) { + throw new Error("Only SPOT market names are supported"); + } + + const tx = await vaultClient.initializeVault({ + name: encodeName(params.name), + spotMarketIndex: marketIndexAndType.marketIndex, + hurdleRate: new BN(params.hurdleRate ?? 0) + .mul(PERCENTAGE_PRECISION) + .div(new BN(100)) + .toNumber(), + profitShare: new BN(params.profitShare) + .mul(PERCENTAGE_PRECISION) + .div(new BN(100)) + .toNumber(), + minDepositAmount: new BN(params.minDepositAmount).mul(spotPrecision), + redeemPeriod: new BN(params.redeemPeriod), + maxTokens: new BN(params.maxTokens).mul(spotPrecision), + managementFee: new BN(params.managementFee) + .mul(PERCENTAGE_PRECISION) + .div(new BN(100)), + permissioned: params.permissioned ?? false, + }); + + return tx; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to create Drift vault: ${e.message}`); + } +} + +/** + Update the vault's info + @param agent SolanaAgentKit instance + @param vault Vault address + @param params Vault update parameters + @param params.redeemPeriod Redeem period in seconds + @param params.maxTokens Maximum amount that can be deposited into the vault (in tokens) + @param params.minDepositAmount Minimum amount that can be deposited into the vault (in tokens) + @param params.managementFee Management fee percentage (e.g 2 == 2%) + @param params.profitShare Profit share percentage (e.g 20 == 20%) + @param params.hurdleRate Hurdle rate percentage + @param params.permissioned Whether the vault uses a whitelist + @returns Promise - The transaction signature of the vault update +*/ +export async function updateVault( + agent: SolanaAgentKit, + vault: string, + params: { + redeemPeriod?: number; + maxTokens?: number; + minDepositAmount?: number; + managementFee?: number; + profitShare?: number; + hurdleRate?: number; + permissioned?: boolean; + }, +) { + try { + const { vaultClient } = initClients(agent); + const vaultPublicKey = new PublicKey(vault); + const vaultDetails = await vaultClient.getVault(vaultPublicKey); + + const tx = await vaultClient.managerUpdateVault(vaultPublicKey, { + redeemPeriod: new BN(params.redeemPeriod ?? vaultDetails.redeemPeriod), + maxTokens: new BN(params.maxTokens ?? vaultDetails.maxTokens), + minDepositAmount: new BN( + params.minDepositAmount ?? vaultDetails.minDepositAmount, + ), + managementFee: new BN(params.managementFee ?? vaultDetails.managementFee), + profitShare: new BN( + params.profitShare ?? vaultDetails.profitShare, + ).toNumber(), + hurdleRate: new BN( + params.hurdleRate ?? vaultDetails.hurdleRate, + ).toNumber(), + permissioned: params.permissioned ?? vaultDetails.permissioned, + }); + + return tx; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to update Drift vault: ${e.message}`); + } +} + +/** + Deposit tokens into a vault + @param agent SolanaAgentKit instance + @param amount Amount to deposit into the vault (in tokens) + @param vault Vault address + @returns Promise - The transaction signature of the deposit +*/ +export async function depositIntoVault( + agent: SolanaAgentKit, + amount: number, + vault: string, +) { + try { + const { vaultClient, driftClient } = initClients(agent); + const vaultPublicKey = new PublicKey(vault); + const [isOwned, vaultDetails] = await Promise.all([ + getIsOwned(agent, vault), + vaultClient.getVault(vaultPublicKey), + ]); + const spotMarket = driftClient.getSpotMarketAccount( + vaultDetails.spotMarketIndex, + ); + + if (!spotMarket) { + throw new Error("Market not found"); + } + + const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); + const amountBN = numberToSafeBN(amount, spotPrecision); + + if (isOwned) { + return await vaultClient.managerDeposit(vaultPublicKey, amountBN); + } + + const vaultDepositor = await getOrCreateVaultDepositor(agent, vault); + + return await vaultClient.deposit(vaultDepositor, amountBN); + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to deposit into Drift vault: ${e.message}`); + } +} + +/** + Request a withdrawal from a vault. If successful redemption period starts and the user can redeem the tokens after the period ends + @param agent SolanaAgentKit instance + @param amount Amount to withdraw from the vault (in shares) + @param vault Vault address +*/ +export async function requestWithdrawalFromVault( + agent: SolanaAgentKit, + amount: number, + vault: string, +) { + try { + const { vaultClient } = initClients(agent); + const vaultPublicKey = new PublicKey(vault); + const isOwned = await getIsOwned(agent, vault); + + if (isOwned) { + return await vaultClient.managerRequestWithdraw( + vaultPublicKey, + new BN(amount.toFixed(0)), + WithdrawUnit.SHARES, + ); + } + + const vaultDepositor = await getOrCreateVaultDepositor(agent, vault); + + const tx = await vaultClient.requestWithdraw( + vaultDepositor, + new BN(amount.toFixed(0)), + WithdrawUnit.SHARES, + ); + + return tx; + } catch (e) { + throw new Error( + // @ts-expect-error - error message is a string + `Failed to request withdrawal from Drift vault: ${e.message}`, + ); + } +} + +/** + Withdraw tokens once the redemption period has elapsed. + @param agent SolanaAgentKit instance + @param vault Vault address + @returns Promise - The transaction signature of the redemption +*/ +export async function withdraw(agent: SolanaAgentKit, vault: string) { + try { + const { vaultClient } = initClients(agent); + const vaultPublicKey = new PublicKey(vault); + const isOwned = await getIsOwned(agent, vault); + + if (isOwned) { + return await vaultClient.managerWithdraw(vaultPublicKey); + } + + const vaultDepositor = await getOrCreateVaultDepositor(agent, vault); + + const tx = await vaultClient.withdraw(vaultDepositor); + + return tx; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to redeem tokens from Drift vault: ${e.message}`); + } +} + +/** + Get if vault is owned by the user + @param agent SolanaAgentKit instance + @param vault Vault address + @returns Promise - Whether the vault is owned by the user +*/ +export async function getIsOwned(agent: SolanaAgentKit, vault: string) { + try { + const { vaultClient } = initClients(agent); + const vaultPublicKey = new PublicKey(vault); + const vaultDetails = await vaultClient.getVault(vaultPublicKey); + + return vaultDetails.delegate.equals(agent.wallet.publicKey); + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to check if vault is owned: ${e.message}`); + } +} + +/** + Carry out a trade with a delegated vault + @param agent SolanaAgentKit instance + @param amount Amount to trade (in tokens) + @param symbol Symbol of the token to trade + @param action Action to take (e.g. "buy" or "sell") + @param type Type of trade (e.g. "market" or "limit") + @param vault Vault address +*/ +export async function trade( + agent: SolanaAgentKit, + amount: number, + symbol: string, + action: "buy" | "sell", + type: "market" | "limit", + vault: string, + price?: number, +) { + try { + const { driftClient, vaultClient } = initClients(agent); + const [isOwned, vaultDetails, driftLookupTableAccount] = await Promise.all([ + getIsOwned(agent, vault), + vaultClient.getVault(new PublicKey(vault)), + driftClient.fetchMarketLookupTableAccount(), + ]); + + if (!isOwned) { + throw new Error( + "This vault is owned by someone else, so you can't trade with it", + ); + } + + driftClient.authority = new PublicKey(vault); + driftClient.activeSubAccountId = 0; + vaultClient.driftClient = driftClient; + + const usdcSpotMarket = driftClient.getSpotMarketAccount(0); + if (!usdcSpotMarket) { + throw new Error("USDC-SPOT market not found"); + } + + const usdcPrecision = TEN.pow(new BN(usdcSpotMarket.decimals)); + const vaultWithdrawalsRequested = convertToNumber( + vaultDetails.totalWithdrawRequested, + usdcPrecision, + ); + // this is actually the authority provided + const user = driftClient.getUser(); + const currentVaultBalance = + convertToNumber(user.getNetSpotMarketValue(), QUOTE_PRECISION) + + convertToNumber(user.getUnrealizedPNL(true), QUOTE_PRECISION); + const availableBalanceInUSD = + currentVaultBalance - vaultWithdrawalsRequested; + + if (amount > availableBalanceInUSD) { + throw new Error( + "Insufficient balance: You don't have enough balance to make this trade", + ); + } + + const perpMarketIndexAndType = driftClient.getMarketIndexAndType( + `${symbol.toUpperCase()}-PERP`, + ); + + if (!perpMarketIndexAndType) { + throw new Error( + "Invalid symbol: Drift doesn't have a market for this token", + ); + } + + const perpOracle = driftClient.getOracleDataForPerpMarket( + perpMarketIndexAndType.marketIndex, + ); + const oraclePriceNumber = convertToNumber( + perpOracle.price, + PRICE_PRECISION, + ); + const baseAmount = amount / oraclePriceNumber; + const instructions: TransactionInstruction[] = []; + + instructions.push( + ComputeBudgetProgram.setComputeUnitLimit({ units: 1400000 }), + ); + + if (type === "limit" || price) { + if (!price) { + throw new Error("Price is required for limit orders"); + } + + const instruction = await driftClient.getPlaceOrdersIx([ + getOrderParams( + getLimitOrderParams({ + price: numberToSafeBN(price, PRICE_PRECISION), + marketType: MarketType.PERP, + baseAssetAmount: numberToSafeBN(baseAmount, BASE_PRECISION), + direction: + action === "buy" + ? PositionDirection.LONG + : PositionDirection.SHORT, + marketIndex: perpMarketIndexAndType.marketIndex, + postOnly: PostOnlyParams.SLIDE, + }), + ), + ]); + + instructions.push(instruction); + } else { + // defaults to market order if type is not limit and price is not provided + const instruction = await driftClient.getPlaceOrdersIx([ + getOrderParams( + getMarketOrderParams({ + marketType: MarketType.PERP, + baseAssetAmount: numberToSafeBN(baseAmount, BASE_PRECISION), + direction: + action === "buy" + ? PositionDirection.LONG + : PositionDirection.SHORT, + marketIndex: perpMarketIndexAndType.marketIndex, + }), + ), + ]); + instructions.push(instruction); + } + + const tx = await driftClient.txSender.sendVersionedTransaction( + await driftClient.txSender.getVersionedTransaction( + instructions, + [driftLookupTableAccount], + [], + driftClient.opts, + ), + ); + + return tx; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to trade with Drift vault: ${e.message}`); + } +} From ad23d8c92b3f8cbc3feffe9d7d3b92cf8b26e780 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 17:08:02 +0100 Subject: [PATCH 05/32] catch up to main --- package.json | 157 +++++++++++++++---------------- pnpm-lock.yaml | 248 +++++++++++++++++++++++++------------------------ 2 files changed, 208 insertions(+), 197 deletions(-) diff --git a/package.json b/package.json index e64c039..63f82e7 100644 --- a/package.json +++ b/package.json @@ -1,81 +1,82 @@ { - "name": "solana-agent-kit", - "version": "1.3.7", - "description": "connect any ai agents to solana protocols", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsc", - "docs": "typedoc src --out docs", - "test": "ts-node test/index.ts", - "test:vercel-ai": "ts-node test/agent_sdks/vercel_ai.ts", - "generate": "ts-node src/utils/keypair.ts", - "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "prepare": "husky" - }, - "engines": { - "node": ">=22.0.0", - "pnpm": ">=8.0.0" - }, - "keywords": [], - "author": "sendaifun", - "license": "Apache-2.0", - "dependencies": { - "@3land/listings-sdk": "^0.0.4", - "@ai-sdk/openai": "^1.0.11", - "@bonfida/spl-name-service": "^3.0.7", - "@cks-systems/manifest-sdk": "0.1.59", - "@coral-xyz/anchor": "0.29", - "@langchain/core": "^0.3.26", - "@langchain/groq": "^0.1.2", - "@langchain/langgraph": "^0.2.36", - "@langchain/openai": "^0.3.16", - "@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/mpl-toolbox": "^0.9.4", - "@metaplex-foundation/umi": "^0.9.2", - "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", - "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", - "@onsol/tldparser": "^0.6.7", - "@orca-so/common-sdk": "0.6.4", - "@orca-so/whirlpools-sdk": "^0.13.12", - "@pythnetwork/hermes-client": "^1.3.0", - "@raydium-io/raydium-sdk-v2": "0.1.95-alpha", - "@solana/spl-token": "^0.4.9", - "@solana/web3.js": "^1.98.0", - "@tensor-oss/tensorswap-sdk": "^4.5.0", + "name": "solana-agent-kit", + "version": "1.3.7", + "description": "connect any ai agents to solana protocols", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "docs": "typedoc src --out docs", + "test": "ts-node test/index.ts", + "test:vercel-ai": "ts-node test/agent_sdks/vercel_ai.ts", + "generate": "ts-node src/utils/keypair.ts", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "prepare": "husky" + }, + "engines": { + "node": ">=22.0.0", + "pnpm": ">=8.0.0" + }, + "keywords": [], + "author": "sendaifun", + "license": "Apache-2.0", + "dependencies": { + "@3land/listings-sdk": "^0.0.4", + "@ai-sdk/openai": "^1.0.11", + "@bonfida/spl-name-service": "^3.0.7", + "@cks-systems/manifest-sdk": "0.1.59", + "@coral-xyz/anchor": "0.29", + "@langchain/core": "^0.3.26", + "@langchain/groq": "^0.1.2", + "@langchain/langgraph": "^0.2.36", + "@langchain/openai": "^0.3.16", + "@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/mpl-toolbox": "^0.9.4", + "@metaplex-foundation/umi": "^0.9.2", + "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", + "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", + "@onsol/tldparser": "^0.6.7", + "@orca-so/common-sdk": "0.6.4", + "@orca-so/whirlpools-sdk": "^0.13.12", + "@pythnetwork/hermes-client": "^1.3.0", + "@raydium-io/raydium-sdk-v2": "0.1.95-alpha", + "@solana/spl-token": "^0.4.9", + "@solana/web3.js": "^1.98.0", + "@tensor-oss/tensorswap-sdk": "^4.5.0", "@sqds/multisig": "^2.1.3", - "@tiplink/api": "^0.3.1", - "ai": "^4.0.22", - "bn.js": "^5.2.1", - "bs58": "^6.0.0", - "chai": "^5.1.2", - "decimal.js": "^10.4.3", - "dotenv": "^16.4.7", - "flash-sdk": "^2.24.3", - "form-data": "^4.0.1", - "langchain": "^0.3.8", - "openai": "^4.77.0", - "typedoc": "^0.27.6", - "zod": "^3.24.1" - }, - "devDependencies": { - "@types/bn.js": "^5.1.6", - "@types/chai": "^5.0.1", - "@types/node": "^22.10.2", - "@typescript-eslint/eslint-plugin": "^8.18.2", - "@typescript-eslint/parser": "^8.18.2", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "husky": "^9.1.7", - "lint-staged": "^15.3.0", - "prettier": "^3.4.2", - "ts-node": "^10.9.2", - "typescript": "^5.7.2" - } + "@tiplink/api": "^0.3.1", + "ai": "^4.0.22", + "bn.js": "^5.2.1", + "bs58": "^6.0.0", + "chai": "^5.1.2", + "decimal.js": "^10.4.3", + "dotenv": "^16.4.7", + "flash-sdk": "^2.24.3", + "form-data": "^4.0.1", + "langchain": "^0.3.8", + "openai": "^4.77.0", + "typedoc": "^0.27.6", + "zod": "^3.24.1" + }, + "devDependencies": { + "@types/bn.js": "^5.1.6", + "@types/chai": "^5.0.1", + "@types/node": "^22.10.2", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "husky": "^9.1.7", + "lint-staged": "^15.3.0", + "prettier": "^3.4.2", + "ts-node": "^10.9.2", + "typescript": "^5.7.2" + }, + "packageManager": "pnpm@9.15.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b98d918..2ef0c43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: dependencies: '@3land/listings-sdk': specifier: ^0.0.4 - version: 0.0.4(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + version: 0.0.4(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@ai-sdk/openai': specifier: ^1.0.11 - version: 1.0.13(zod@3.24.1) + version: 1.0.11(zod@3.24.1) '@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) @@ -109,7 +109,7 @@ importers: version: 16.4.7 flash-sdk: specifier: ^2.24.3 - version: 2.24.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + version: 2.24.3(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) form-data: specifier: ^4.0.1 version: 4.0.1 @@ -134,7 +134,7 @@ importers: version: 5.0.1 '@types/node': specifier: ^22.10.2 - version: 22.10.2 + version: 22.10.5 '@typescript-eslint/eslint-plugin': specifier: ^8.18.2 version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) @@ -161,7 +161,7 @@ importers: version: 3.4.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) + version: 10.9.2(@types/node@22.10.5)(typescript@5.7.2) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -855,6 +855,9 @@ packages: '@shikijs/vscode-textmate@10.0.1': resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@shikijs/vscode-textmate@9.3.1': + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1036,6 +1039,10 @@ packages: '@solana/web3.js@1.98.0': resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + '@sqds/multisig@2.1.3': + resolution: {integrity: sha512-WOiL7La+RSiJsz7jVO85yhSiiSvNMUthiWuLPeWVOoD6IYa34BEAzanF1RdXRWGglSbRFYCTkyr+Ay1WmXmSRQ==} + engines: {node: '>=14'} + '@supercharge/promise-pool@3.2.0': resolution: {integrity: sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==} engines: {node: '>=8'} @@ -2121,12 +2128,8 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} get-stream@5.2.0: @@ -2284,6 +2287,9 @@ packages: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -2347,10 +2353,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - is-retry-allowed@2.2.0: resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} engines: {node: '>=10'} @@ -3060,8 +3062,8 @@ packages: regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.1.1: - resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -3661,14 +3663,14 @@ packages: snapshots: - '@3land/listings-sdk@0.0.4(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + '@3land/listings-sdk@0.0.4(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@irys/sdk': 0.2.11(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@irys/sdk': 0.2.11(arweave@1.15.5)(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) - '@project-serum/anchor': 0.26.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@project-serum/anchor': 0.26.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) bn: 1.0.5 bn.js: 5.2.1 bs58: 6.0.0 @@ -3743,8 +3745,8 @@ snapshots: dependencies: '@aptos-labs/aptos-cli': 1.0.2 '@aptos-labs/aptos-client': 0.1.1 - '@noble/curves': 1.8.0 - '@noble/hashes': 1.7.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 eventemitter3: 5.0.1 @@ -3838,16 +3840,16 @@ snapshots: - encoding - utf-8-validate - '@coral-xyz/anchor@0.27.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@coral-xyz/anchor@0.27.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.27.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.27.0(@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) base64-js: 1.5.1 bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 camelcase: 6.3.0 - cross-fetch: 3.2.0 + cross-fetch: 3.1.8 crypto-hash: 1.3.0 eventemitter3: 4.0.7 js-sha256: 0.9.0 @@ -3860,7 +3862,7 @@ snapshots: - encoding - utf-8-validate - '@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@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 @@ -3887,27 +3889,27 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 - '@coral-xyz/borsh@0.27.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.27.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.9)(utf-8-validate@5.0.10) + '@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 - '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) bn.js: 5.2.1 buffer-layout: 1.2.2 - '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@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.9)(utf-8-validate@5.0.10) + '@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 - '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.30.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.9)(utf-8-validate@5.0.10) + '@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 @@ -4122,7 +4124,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -4143,7 +4145,7 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bech32: 1.1.4 - ws: 7.4.6(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -4271,22 +4273,22 @@ snapshots: transitivePeerDependencies: - debug - '@irys/sdk@0.2.11(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@irys/sdk@0.2.11(arweave@1.15.5)(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@aptos-labs/ts-sdk': 1.33.1 '@ethersproject/bignumber': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/wallet': 5.7.0 '@irys/query': 0.0.8 '@near-js/crypto': 0.0.3 '@near-js/keystores-browser': 0.0.3 '@near-js/providers': 0.0.4 '@near-js/transactions': 0.1.1 - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@supercharge/promise-pool': 3.2.0 algosdk: 1.24.1 - arbundles: 0.11.2(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10) + arbundles: 0.11.2(arweave@1.15.5)(bufferutil@4.0.8)(utf-8-validate@5.0.10) async-retry: 1.3.3 axios: 1.7.9 base64url: 3.0.1 @@ -4778,7 +4780,7 @@ snapshots: '@noble/curves@1.7.0': dependencies: - '@noble/hashes': 1.7.0 + '@noble/hashes': 1.6.0 '@noble/ed25519@1.7.3': {} @@ -4839,16 +4841,16 @@ snapshots: '@pkgr/core@0.1.1': {} - '@project-serum/anchor@0.26.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@project-serum/anchor@0.26.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.26.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.26.0(@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) base64-js: 1.5.1 bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 camelcase: 6.3.0 - cross-fetch: 3.2.0 + cross-fetch: 3.1.8 crypto-hash: 1.3.0 eventemitter3: 4.0.7 js-sha256: 0.9.0 @@ -4861,11 +4863,11 @@ snapshots: - encoding - utf-8-validate - '@pythnetwork/client@2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@pythnetwork/client@2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -4880,15 +4882,15 @@ snapshots: transitivePeerDependencies: - axios - '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@pythnetwork/price-service-sdk': 1.8.0 '@types/ws': 8.5.13 axios: 1.7.9 axios-retry: 3.9.1 - isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) ts-log: 2.2.7 - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -4906,7 +4908,7 @@ snapshots: '@randlabs/communication-bridge': 1.0.1 optional: true - '@raydium-io/raydium-sdk-v2@0.1.95-alpha(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + '@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) @@ -4997,9 +4999,11 @@ snapshots: '@shikijs/vscode-textmate@10.0.1': {} + '@shikijs/vscode-textmate@9.3.1': {} + '@sindresorhus/is@4.6.0': {} - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@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) @@ -5266,15 +5270,15 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.9)(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.8(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.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.8(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.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + '@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@4.9.5)': dependencies: '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -5303,12 +5307,12 @@ snapshots: - encoding - utf-8-validate - '@solana/spl-token@0.3.11(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.3.11(@solana/web3.js@1.95.8(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.9)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: - bufferutil @@ -5317,7 +5321,7 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.3.11(@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@4.9.5)(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) @@ -5400,7 +5404,7 @@ snapshots: '@noble/curves': 1.7.0 '@noble/hashes': 1.6.1 '@solana/buffer-layout': 4.0.1 - agentkeepalive: 4.5.0 + agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 bn.js: 5.2.1 borsh: 0.7.0 @@ -5416,11 +5420,11 @@ snapshots: - encoding - utf-8-validate - '@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.26.0 - '@noble/curves': 1.8.0 - '@noble/hashes': 1.7.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 @@ -5429,7 +5433,7 @@ snapshots: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + 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 @@ -5438,13 +5442,13 @@ snapshots: - encoding - utf-8-validate - '@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@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 + agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 bn.js: 5.2.1 borsh: 0.7.0 @@ -5460,6 +5464,26 @@ snapshots: - encoding - utf-8-validate + '@sqds/multisig@2.1.3(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet-solana': 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@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) + '@types/bn.js': 5.1.6 + assert: 2.1.0 + bn.js: 5.2.1 + buffer: 6.0.3 + invariant: 2.2.4 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + '@supercharge/promise-pool@3.2.0': {} '@swc/helpers@0.5.15': @@ -5470,7 +5494,7 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tensor-hq/tensor-common@8.3.1(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + '@tensor-hq/tensor-common@8.3.1(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor': 0.26.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metaplex-foundation/mpl-auction-house': 2.5.1(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) @@ -5550,7 +5574,7 @@ snapshots: '@types/bn.js@5.1.6': dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@types/body-parser@1.19.5': dependencies: @@ -5570,7 +5594,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@types/deep-eql@4.0.2': {} @@ -5580,7 +5604,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@types/qs': 6.9.17 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -5614,7 +5638,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 form-data: 4.0.1 '@types/node@11.11.6': {} @@ -5652,12 +5676,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@types/send': 0.17.4 '@types/unist@3.0.3': {} @@ -5668,11 +5692,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@types/ws@8.5.13': dependencies: - '@types/node': 22.10.2 + '@types/node': 22.10.5 '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': dependencies: @@ -5814,7 +5838,7 @@ snapshots: dependencies: algo-msgpack-with-bigint: 2.1.1 buffer: 6.0.3 - cross-fetch: 3.2.0 + cross-fetch: 3.1.8 hi-base32: 0.5.1 js-sha256: 0.9.0 js-sha3: 0.8.0 @@ -5847,11 +5871,11 @@ snapshots: ansicolors@0.3.2: {} - arbundles@0.11.2(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10): + arbundles@0.11.2(arweave@1.15.5)(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/hash': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 @@ -5901,7 +5925,7 @@ snapshots: asn1.js@5.4.1: dependencies: - bn.js: 4.11.6 + bn.js: 4.12.1 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 @@ -6715,13 +6739,13 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flash-sdk@2.24.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10): + flash-sdk@2.24.3(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10): dependencies: - '@coral-xyz/anchor': 0.27.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@pythnetwork/client': 2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@pythnetwork/price-service-client': 1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@solana/spl-token': 0.3.11(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/anchor': 0.27.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@pythnetwork/client': 2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@pythnetwork/price-service-client': 1.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.95.8(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.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@types/node': 20.17.11 bignumber.js: 9.1.2 bs58: 5.0.0 @@ -6809,11 +6833,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.0.0 - get-stream@5.2.0: dependencies: pump: 3.0.2 @@ -6892,7 +6911,7 @@ snapshots: '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 - agentkeepalive: 4.5.0 + agentkeepalive: 4.6.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 node-fetch: 2.7.0 @@ -7026,6 +7045,10 @@ snapshots: through: 2.3.8 wrap-ansi: 6.2.0 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} @@ -7070,13 +7093,6 @@ snapshots: is-path-inside@3.0.3: {} - is-regex@1.2.1: - dependencies: - call-bound: 1.0.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - is-retry-allowed@2.2.0: {} is-stream@3.0.0: {} @@ -7093,11 +7109,11 @@ snapshots: 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.9)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - isomorphic-ws@4.0.1(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isomorphic-ws@4.0.1(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) jackspeak@3.4.3: dependencies: @@ -7553,7 +7569,7 @@ snapshots: '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 - agentkeepalive: 4.5.0 + agentkeepalive: 4.6.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 node-fetch: 2.7.0 @@ -7817,12 +7833,6 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-regex: 1.2.1 - safer-buffer@2.1.2: {} scrypt-js@3.0.1: {} @@ -8116,7 +8126,7 @@ snapshots: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.10.2 + '@types/node': 22.10.5 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -8338,12 +8348,12 @@ snapshots: wrappy@1.0.2: {} - ws@7.4.6(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: - bufferutil: 4.0.9 + bufferutil: 4.0.8 utf-8-validate: 5.0.10 - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): + 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 From 272f77f851071eef212873dc39c95a5dde6bfd44 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 17:31:08 +0100 Subject: [PATCH 06/32] feat: token balances --- src/actions/balance.ts | 5 ++- src/actions/index.ts | 2 + src/actions/tokenBalances.ts | 80 +++++++++++++++++++++++++++++++++ src/tools/get_balance.ts | 53 +++------------------- src/tools/get_token_balances.ts | 65 +++++++++++++++++++++++++++ test/agent_sdks/vercel_ai.ts | 1 - 6 files changed, 156 insertions(+), 50 deletions(-) create mode 100644 src/actions/tokenBalances.ts create mode 100644 src/tools/get_token_balances.ts diff --git a/src/actions/balance.ts b/src/actions/balance.ts index 1ee1b56..437e479 100644 --- a/src/actions/balance.ts +++ b/src/actions/balance.ts @@ -1,6 +1,6 @@ import { PublicKey } from "@solana/web3.js"; -import { Action } from "../types/action"; -import { SolanaAgentKit } from "../agent"; +import type { Action } from "../types/action"; +import type { SolanaAgentKit } from "../agent"; import { z } from "zod"; import { get_balance } from "../tools"; @@ -54,6 +54,7 @@ const balanceAction: Action = { return { status: "success", balance: balance, + token: input.tokenAddress || "SOL", }; }, }; diff --git a/src/actions/index.ts b/src/actions/index.ts index c974209..9eec07d 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -30,9 +30,11 @@ import launchPumpfunTokenAction from "./launchPumpfunToken"; import getWalletAddressAction from "./getWalletAddress"; import flashOpenTradeAction from "./flashOpenTrade"; import flashCloseTradeAction from "./flashCloseTrade"; +import tokenBalancesAction from "./tokenBalances"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, + TOKEN_BALANCES_ACTION: tokenBalancesAction, DEPLOY_TOKEN_ACTION: deployTokenAction, BALANCE_ACTION: balanceAction, TRANSFER_ACTION: transferAction, diff --git a/src/actions/tokenBalances.ts b/src/actions/tokenBalances.ts new file mode 100644 index 0000000..960fca1 --- /dev/null +++ b/src/actions/tokenBalances.ts @@ -0,0 +1,80 @@ +import { PublicKey } from "@solana/web3.js"; +import type { Action } from "../types/action"; +import type { SolanaAgentKit } from "../agent"; +import { z } from "zod"; +import { get_token_balance } from "../tools/get_token_balances"; + +const tokenBalancesAction: Action = { + name: "TOKEN_BALANCE_ACTION", + similes: [ + "check token balances", + "get wallet token balances", + "view token balances", + "show token balances", + "check token balance", + ], + description: `Get the token balances of a Solana wallet. + If you want to get the balance of your wallet, you don't need to provide the wallet address.`, + examples: [ + [ + { + input: {}, + output: { + status: "success", + balance: { + sol: 100, + tokens: [ + { + tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + name: "USD Coin", + symbol: "USDC", + balance: 100, + decimals: 9, + }, + ], + }, + }, + explanation: "Get token balances of the wallet", + }, + ], + [ + { + input: { + walletAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + }, + output: { + status: "success", + balance: { + sol: 100, + tokens: [ + { + tokenAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + name: "USD Coin", + symbol: "USDC", + balance: 100, + decimals: 9, + }, + ], + }, + }, + explanation: "Get address token balance", + }, + ], + ], + schema: z.object({ + walletAddress: z.string().optional(), + }), + handler: async (agent: SolanaAgentKit, input: Record) => { + const balance = await get_token_balance( + agent, + input.tokenAddress && new PublicKey(input.tokenAddress), + ); + + return { + status: "success", + balance: balance, + }; + }, +}; + +export default tokenBalancesAction; diff --git a/src/tools/get_balance.ts b/src/tools/get_balance.ts index 3e30021..f7a6a1e 100644 --- a/src/tools/get_balance.ts +++ b/src/tools/get_balance.ts @@ -1,7 +1,5 @@ -import { LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; -import { SolanaAgentKit } from "../index"; -import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; -import { getTokenMetadata } from "../utils/tokenMetadata"; +import { LAMPORTS_PER_SOL, type PublicKey } from "@solana/web3.js"; +import type { SolanaAgentKit } from "../index"; /** * Get the balance of SOL or an SPL token for the agent's wallet @@ -12,51 +10,12 @@ import { getTokenMetadata } from "../utils/tokenMetadata"; export async function get_balance( agent: SolanaAgentKit, token_address?: PublicKey, -): Promise< - | number - | { - sol: number; - tokens: Array<{ - tokenAddress: string; - name: string; - symbol: string; - balance: number; - decimals: number; - }>; - } -> { +): Promise { if (!token_address) { - const [lamportsBalance, tokenAccountData] = await Promise.all([ - agent.connection.getBalance(agent.wallet_address), - agent.connection.getParsedTokenAccountsByOwner(agent.wallet_address, { - programId: TOKEN_PROGRAM_ID, - }), - ]); - - const removedZeroBalance = tokenAccountData.value.filter( - (v) => v.account.data.parsed.info.tokenAmount.uiAmount !== 0, + return ( + (await agent.connection.getBalance(agent.wallet_address)) / + LAMPORTS_PER_SOL ); - - const tokenBalances = await Promise.all( - removedZeroBalance.map(async (v) => { - const mint = v.account.data.parsed.info.mint; - const mintInfo = await getTokenMetadata(agent.connection, mint); - return { - tokenAddress: mint, - name: mintInfo.name ?? "", - symbol: mintInfo.symbol ?? "", - balance: v.account.data.parsed.info.tokenAmount.uiAmount as number, - decimals: v.account.data.parsed.info.tokenAmount.decimals as number, - }; - }), - ); - - const solBalance = lamportsBalance / LAMPORTS_PER_SOL; - - return { - sol: solBalance, - tokens: tokenBalances, - }; } const token_account = diff --git a/src/tools/get_token_balances.ts b/src/tools/get_token_balances.ts new file mode 100644 index 0000000..00e6310 --- /dev/null +++ b/src/tools/get_token_balances.ts @@ -0,0 +1,65 @@ +import { LAMPORTS_PER_SOL, type PublicKey } from "@solana/web3.js"; +import type { SolanaAgentKit } from "../index"; +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { getTokenMetadata } from "../utils/tokenMetadata"; + +/** + * Get the token balances of a Solana wallet + * @param agent - SolanaAgentKit instance + * @param token_address - Optional SPL token mint address. If not provided, returns SOL balance + * @returns Promise resolving to the balance as an object containing sol balance and token balances with their respective mints, symbols, names and decimals + */ +export async function get_token_balance( + agent: SolanaAgentKit, + token_address?: PublicKey, +): Promise< + | number + | { + sol: number; + tokens: Array<{ + tokenAddress: string; + name: string; + symbol: string; + balance: number; + decimals: number; + }>; + } +> { + if (!token_address) { + const [lamportsBalance, tokenAccountData] = await Promise.all([ + agent.connection.getBalance(agent.wallet_address), + agent.connection.getParsedTokenAccountsByOwner(agent.wallet_address, { + programId: TOKEN_PROGRAM_ID, + }), + ]); + + const removedZeroBalance = tokenAccountData.value.filter( + (v) => v.account.data.parsed.info.tokenAmount.uiAmount !== 0, + ); + + const tokenBalances = await Promise.all( + removedZeroBalance.map(async (v) => { + const mint = v.account.data.parsed.info.mint; + const mintInfo = await getTokenMetadata(agent.connection, mint); + return { + tokenAddress: mint, + name: mintInfo.name ?? "", + symbol: mintInfo.symbol ?? "", + balance: v.account.data.parsed.info.tokenAmount.uiAmount as number, + decimals: v.account.data.parsed.info.tokenAmount.decimals as number, + }; + }), + ); + + const solBalance = lamportsBalance / LAMPORTS_PER_SOL; + + return { + sol: solBalance, + tokens: tokenBalances, + }; + } + + const token_account = + await agent.connection.getTokenAccountBalance(token_address); + return token_account.value.uiAmount || 0; +} diff --git a/test/agent_sdks/vercel_ai.ts b/test/agent_sdks/vercel_ai.ts index 77fda22..bf1585e 100644 --- a/test/agent_sdks/vercel_ai.ts +++ b/test/agent_sdks/vercel_ai.ts @@ -95,7 +95,6 @@ async function runChatMode() { ); const tools = createVercelAITools(solanaAgent); - console.log(tools); const rl = readline.createInterface({ input: process.stdin, From 51cf665c74c1a647c7598984e59f82758993c0eb Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 17:31:29 +0100 Subject: [PATCH 07/32] lint --- src/tools/squads_multisig/deposit_to_multisig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/squads_multisig/deposit_to_multisig.ts b/src/tools/squads_multisig/deposit_to_multisig.ts index 11a2582..e2b23ad 100644 --- a/src/tools/squads_multisig/deposit_to_multisig.ts +++ b/src/tools/squads_multisig/deposit_to_multisig.ts @@ -54,7 +54,7 @@ export async function deposit_to_multisig( mint, agent.wallet_address, ); - let transaction = new Transaction(); + const transaction = new Transaction(); const toAta = await getAssociatedTokenAddress(mint, to, true); const toTokenAccountInfo = await agent.connection.getAccountInfo(toAta); // Create associated token account if it doesn't exist From 6ef55a04dad4173387523d62de2b6a1a5d2898e7 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 17:38:20 +0100 Subject: [PATCH 08/32] fix: parse provided wallet address to token balances --- src/agent/index.ts | 28 ++++++----- src/tools/get_token_balances.ts | 86 +++++++++++++++------------------ 2 files changed, 55 insertions(+), 59 deletions(-) diff --git a/src/agent/index.ts b/src/agent/index.ts index 0238b0d..2eec42a 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -92,6 +92,7 @@ import { create_proposal } from "../tools/squads_multisig/create_proposal"; import { approve_proposal } from "../tools/squads_multisig/approve_proposal"; import { execute_transaction } from "../tools/squads_multisig/execute_proposal"; import { reject_proposal } from "../tools/squads_multisig/reject_proposal"; +import { get_token_balance } from "../tools/get_token_balances"; /** * Main class for interacting with Solana blockchain @@ -163,22 +164,23 @@ export class SolanaAgentKit { return deploy_collection(this, options); } - async getBalance(token_address?: PublicKey): Promise< - | number - | { - sol: number; - tokens: Array<{ - tokenAddress: string; - name: string; - symbol: string; - balance: number; - decimals: number; - }>; - } - > { + async getBalance(token_address?: PublicKey): Promise { return get_balance(this, token_address); } + async getTokenBalances(wallet_address?: PublicKey): Promise<{ + sol: number; + tokens: Array<{ + tokenAddress: string; + name: string; + symbol: string; + balance: number; + decimals: number; + }>; + }> { + return get_token_balance(this, wallet_address); + } + async getBalanceOther( walletAddress: PublicKey, tokenAddress?: PublicKey, diff --git a/src/tools/get_token_balances.ts b/src/tools/get_token_balances.ts index 00e6310..01f2f2d 100644 --- a/src/tools/get_token_balances.ts +++ b/src/tools/get_token_balances.ts @@ -11,55 +11,49 @@ import { getTokenMetadata } from "../utils/tokenMetadata"; */ export async function get_token_balance( agent: SolanaAgentKit, - token_address?: PublicKey, -): Promise< - | number - | { - sol: number; - tokens: Array<{ - tokenAddress: string; - name: string; - symbol: string; - balance: number; - decimals: number; - }>; - } -> { - if (!token_address) { - const [lamportsBalance, tokenAccountData] = await Promise.all([ - agent.connection.getBalance(agent.wallet_address), - agent.connection.getParsedTokenAccountsByOwner(agent.wallet_address, { + walletAddress?: PublicKey, +): Promise<{ + sol: number; + tokens: Array<{ + tokenAddress: string; + name: string; + symbol: string; + balance: number; + decimals: number; + }>; +}> { + const [lamportsBalance, tokenAccountData] = await Promise.all([ + agent.connection.getBalance(walletAddress ?? agent.wallet_address), + agent.connection.getParsedTokenAccountsByOwner( + walletAddress ?? agent.wallet_address, + { programId: TOKEN_PROGRAM_ID, - }), - ]); + }, + ), + ]); - const removedZeroBalance = tokenAccountData.value.filter( - (v) => v.account.data.parsed.info.tokenAmount.uiAmount !== 0, - ); + const removedZeroBalance = tokenAccountData.value.filter( + (v) => v.account.data.parsed.info.tokenAmount.uiAmount !== 0, + ); - const tokenBalances = await Promise.all( - removedZeroBalance.map(async (v) => { - const mint = v.account.data.parsed.info.mint; - const mintInfo = await getTokenMetadata(agent.connection, mint); - return { - tokenAddress: mint, - name: mintInfo.name ?? "", - symbol: mintInfo.symbol ?? "", - balance: v.account.data.parsed.info.tokenAmount.uiAmount as number, - decimals: v.account.data.parsed.info.tokenAmount.decimals as number, - }; - }), - ); + const tokenBalances = await Promise.all( + removedZeroBalance.map(async (v) => { + const mint = v.account.data.parsed.info.mint; + const mintInfo = await getTokenMetadata(agent.connection, mint); + return { + tokenAddress: mint, + name: mintInfo.name ?? "", + symbol: mintInfo.symbol ?? "", + balance: v.account.data.parsed.info.tokenAmount.uiAmount as number, + decimals: v.account.data.parsed.info.tokenAmount.decimals as number, + }; + }), + ); - const solBalance = lamportsBalance / LAMPORTS_PER_SOL; + const solBalance = lamportsBalance / LAMPORTS_PER_SOL; - return { - sol: solBalance, - tokens: tokenBalances, - }; - } - - const token_account = - await agent.connection.getTokenAccountBalance(token_address); - return token_account.value.uiAmount || 0; + return { + sol: solBalance, + tokens: tokenBalances, + }; } From 315ce64eedeb4e0b5d60fbcca728f83754954c60 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 19:46:42 +0100 Subject: [PATCH 09/32] feat: drift vault actions --- src/actions/drift/createVault.ts | 65 ++++++++++ src/actions/drift/depositIntoVault.ts | 54 +++++++++ .../drift/requestWithdrawalFromVault.ts | 54 +++++++++ src/actions/drift/tradeDelegatedDriftVault.ts | 114 ++++++++++++++++++ src/actions/drift/updateVault.ts | 76 ++++++++++++ src/actions/drift/withdrawFromVault.ts | 52 ++++++++ src/actions/index.ts | 12 ++ src/actions/mintNFT.ts | 2 +- src/tools/drift_vault.ts | 21 ++-- src/tools/index.ts | 2 + 10 files changed, 444 insertions(+), 8 deletions(-) create mode 100644 src/actions/drift/createVault.ts create mode 100644 src/actions/drift/depositIntoVault.ts create mode 100644 src/actions/drift/requestWithdrawalFromVault.ts create mode 100644 src/actions/drift/tradeDelegatedDriftVault.ts create mode 100644 src/actions/drift/updateVault.ts create mode 100644 src/actions/drift/withdrawFromVault.ts diff --git a/src/actions/drift/createVault.ts b/src/actions/drift/createVault.ts new file mode 100644 index 0000000..8262f0a --- /dev/null +++ b/src/actions/drift/createVault.ts @@ -0,0 +1,65 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import type { SolanaAgentKit } from "../.."; +import { createVault } from "../../tools/drift_vault"; + +const createDriftVaultAction: Action = { + name: "CREATE_DRIFT_VAULT", + similes: ["create a drift vault", "open a drift vault", "create vault"], + description: + "Create a new drift vault delegating the agents address as the owner.", + examples: [ + [ + { + input: {}, + output: { + status: "success", + message: "Drift vault created successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Create a drift vault", + }, + ], + ], + schema: z.object({ + name: z.string().min(5, "Name must be at least 5 characters"), + // regex matches SOL-SPOT + marketName: z.string().regex(/^([A-Za-z0-9]{2,7})-SPOT$/), + redeemPeriod: z.number().int().min(1, "Redeem period must be at least 1"), + maxTokens: z.number().int().min(100, "Max tokens must be at least 100"), + minDepositAmount: z.number().positive(), + managementFee: z.number().positive().max(20), + profitShare: z.number().positive().max(90).optional().default(5), + handleRate: z.number().optional(), + permissioned: z + .boolean() + .optional() + .describe("Should the vault have a whitelist of not"), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const tx = await createVault( + agent, + // @ts-expect-error - zod schema validation + { + ...input, + }, + ); + + return { + status: "success", + message: "Drift vault created successfully", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - e is not a string + message: `Failed to create drift vault: ${e.message}`, + }; + } + }, +}; + +export default createDriftVaultAction; diff --git a/src/actions/drift/depositIntoVault.ts b/src/actions/drift/depositIntoVault.ts new file mode 100644 index 0000000..3c44bb3 --- /dev/null +++ b/src/actions/drift/depositIntoVault.ts @@ -0,0 +1,54 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import type { SolanaAgentKit } from "../../agent"; +import { depositIntoVault } from "../../tools/drift_vault"; + +const depositIntoDriftVaultAction: Action = { + name: "DEPOSIT_INTO_DRIFT_VAULT", + description: "Deposit funds into an existing drift vault", + similes: ["deposit into drift vault", "add funds to drift vault"], + examples: [ + [ + { + input: { + amount: 100, + vaultAddress: "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBD", + }, + output: { + status: "success", + message: "Funds deposited successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Deposit 100 USDC into a drift vault", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string(), + amount: z.number().positive(), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const tx = await depositIntoVault( + agent, + input.amount as number, + input.vaultAddress as string, + ); + + return { + status: "success", + message: "Funds deposited successfully", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to deposit funds: ${e.message}`, + }; + } + }, +}; + +export default depositIntoDriftVaultAction; diff --git a/src/actions/drift/requestWithdrawalFromVault.ts b/src/actions/drift/requestWithdrawalFromVault.ts new file mode 100644 index 0000000..789c58d --- /dev/null +++ b/src/actions/drift/requestWithdrawalFromVault.ts @@ -0,0 +1,54 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import type { SolanaAgentKit } from "../../agent"; +import { requestWithdrawalFromVault } from "../../tools/drift_vault"; + +const requestWithdrawalFromVaultAction: Action = { + name: "REQUEST_WITHDRAWAL_FROM_DRIFT_VAULT", + description: "Request a withdrawal from an existing drift vault", + similes: ["withdraw from drift vault", "request withdrawal from vault"], + examples: [ + [ + { + input: { + amount: 100, + vaultAddress: "2nFeP7taii", + }, + output: { + status: "success", + message: "Withdrawal request successful", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Request a withdrawal of 100 USDC from a drift vault", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string(), + amount: z.number().positive(), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const tx = await requestWithdrawalFromVault( + agent, + input.amount as number, + input.vaultAddress as string, + ); + + return { + status: "success", + message: "Withdrawal request successful", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to request withdrawal: ${e.message}`, + }; + } + }, +}; + +export default requestWithdrawalFromVaultAction; diff --git a/src/actions/drift/tradeDelegatedDriftVault.ts b/src/actions/drift/tradeDelegatedDriftVault.ts new file mode 100644 index 0000000..a51e143 --- /dev/null +++ b/src/actions/drift/tradeDelegatedDriftVault.ts @@ -0,0 +1,114 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import type { SolanaAgentKit } from "../../agent"; +import { tradeDriftVault } from "../../tools"; + +const tradeDelegatedDriftVaultAction: Action = { + name: "TRADE_DELEGATED_DRIFT_VAULT", + similes: [ + "trade delegated drift vault", + "trade delegated vault", + "trade vault", + "trade drift vault", + "trade delegated vault", + "trade vault", + "trade drift vault", + "open drift vault trade", + ], + description: "Carry out trades in a Drift vault.", + examples: [ + [ + { + input: { + vaultAddress: "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w", + amount: 100, + symbol: "SOL", + action: "buy", + type: "market", + }, + output: { + status: "success", + message: "Trade successful", + transactionId: "7nE9GvcwsqzYxmJLSrYmSB1V1YoJWVK1KWzAcWAzjXkN", + amount: 100, + symbol: "SOL", + action: "buy", + type: "market", + }, + explanation: "Buy 100 SOL in the vault", + }, + ], + [ + { + input: { + vaultAddress: "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w", + amount: 50, + symbol: "SOL", + action: "sell", + type: "limit", + price: 200, + }, + output: { + status: "success", + message: "Order placed successful", + transactionId: "8nE9GvcwsqzYxmJLSrYmSB1V1YoJWVK1KWzAcWAzjXkM", + amount: 50, + symbol: "SOL", + action: "sell", + type: "limit", + price: 200, + }, + explanation: "Sell 50 SOL in the vault at $200", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string().describe("Address of the Drift vault to trade in"), + amount: z.number().positive().describe("Amount to trade"), + symbol: z.string().describe("Symbol of the token to trade"), + action: z.enum(["buy", "sell"]).describe("Trade action - buy or sell"), + type: z.enum(["market", "limit"]).describe("Trade type - market or limit"), + price: z.number().positive().optional().describe("Price for limit order"), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const params = { + vaultAddress: input.vaultAddress as string, + amount: input.amount as number, + symbol: input.symbol as string, + action: input.action as "buy" | "sell", + type: input.type as "market" | "limit", + price: input.price as number | undefined, + }; + + // Carry out the trade + const transactionId = await tradeDriftVault( + agent, + params.vaultAddress, + params.amount, + params.symbol, + params.action, + params.type, + params.price, + ); + + return { + status: "success", + message: + params.type === "limit" + ? "Order placed successfully" + : "Trade successful", + transactionId, + ...params, + }; + } catch (error) { + return { + status: "error", + // @ts-expect-error error is not a string + message: error.message, + }; + } + }, +}; + +export default tradeDelegatedDriftVaultAction; diff --git a/src/actions/drift/updateVault.ts b/src/actions/drift/updateVault.ts new file mode 100644 index 0000000..6aa82f2 --- /dev/null +++ b/src/actions/drift/updateVault.ts @@ -0,0 +1,76 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import type { SolanaAgentKit } from "../../agent"; +import { updateVault } from "../../tools/drift_vault"; + +const updateDriftVaultAction: Action = { + name: "UPDATE_DRIFT_VAULT", + similes: ["update a drift vault", "modify a drift vault", "update vault"], + description: "Update an existing drift vault with new settings.", + examples: [ + [ + { + input: { + redeemPeriod: 30, + maxTokens: 10000, + minDepositAmount: 10, + managementFee: 5, + profitShare: 10, + handleRate: 0.1, + permissioned: false, + vaultAddress: "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBD", + }, + output: { + status: "success", + message: "Drift vault updated successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Update a drift vault", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string(), + name: z.string().min(5, "Name must be at least 5 characters"), + // regex matches SOL-SPOT + marketName: z.string().regex(/^([A-Za-z0-9]{2,7})-SPOT$/), + redeemPeriod: z.number().int().min(1, "Redeem period must be at least 1"), + maxTokens: z.number().int().min(100, "Max tokens must be at least 100"), + minDepositAmount: z.number().positive(), + managementFee: z.number().positive().max(20), + profitShare: z.number().positive().max(90).optional().default(5), + handleRate: z.number().optional(), + permissioned: z + .boolean() + .optional() + .describe("Should the vault have a whitelist of not"), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const tx = await updateVault(agent, input.vaultAddress, { + hurdleRate: input.hurdleRate, + maxTokens: input.maxTokens, + minDepositAmount: input.minDepositAmount, + profitShare: input.profitShare, + managementFee: input.managementFee, + permissioned: input.permissioned, + redeemPeriod: input.redeemPeriod, + }); + + return { + status: "success", + message: "Drift vault parameters updated successfully", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to update drift vault: ${e.message}`, + }; + } + }, +}; + +export default updateDriftVaultAction; diff --git a/src/actions/drift/withdrawFromVault.ts b/src/actions/drift/withdrawFromVault.ts new file mode 100644 index 0000000..b6007f2 --- /dev/null +++ b/src/actions/drift/withdrawFromVault.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import type { SolanaAgentKit } from "../../agent"; +import { withdrawFromDriftVault } from "../../tools"; + +const withdrawFromVaultAction: Action = { + name: "WITHDRAW_FROM_DRIFT_VAULT", + description: + "Withdraw funds from a vault given the redemption time has elapsed.", + similes: ["withdraw from drift vault", "redeem funds from vault"], + examples: [ + [ + { + input: { + vaultAddress: "2nFeP7taii", + }, + output: { + status: "success", + message: "Withdrawal successful", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Withdraw funds from a drift vault", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string(), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const tx = await withdrawFromDriftVault( + agent, + input.vaultAddress as string, + ); + + return { + status: "success", + message: "Withdrawal successful", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to withdraw funds: ${e.message}`, + }; + } + }, +}; + +export default withdrawFromVaultAction; diff --git a/src/actions/index.ts b/src/actions/index.ts index c974209..217d547 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -30,6 +30,12 @@ import launchPumpfunTokenAction from "./launchPumpfunToken"; import getWalletAddressAction from "./getWalletAddress"; import flashOpenTradeAction from "./flashOpenTrade"; import flashCloseTradeAction from "./flashCloseTrade"; +import createDriftVaultAction from "./drift/createVault"; +import updateDriftVaultAction from "./drift/updateVault"; +import depositIntoDriftVaultAction from "./drift/depositIntoVault"; +import requestWithdrawalFromVaultAction from "./drift/requestWithdrawalFromVault"; +import withdrawFromVaultAction from "./drift/withdrawFromVault"; +import tradeDelegatedDriftVaultAction from "./drift/tradeDelegatedDriftVault"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -65,6 +71,12 @@ export const ACTIONS = { LAUNCH_PUMPFUN_TOKEN_ACTION: launchPumpfunTokenAction, FLASH_OPEN_TRADE_ACTION: flashOpenTradeAction, FLASH_CLOSE_TRADE_ACTION: flashCloseTradeAction, + CREATE_DRIFT_VAULT_ACTION: createDriftVaultAction, + UPDATE_DRIFT_VAULT_ACTION: updateDriftVaultAction, + DEPOSIT_INTO_DRIFT_VAULT_ACTION: depositIntoDriftVaultAction, + REQUEST_WITHDRAWAL_FROM_DRIFT_VAULT_ACTION: requestWithdrawalFromVaultAction, + WITHDRAW_FROM_DRIFT_VAULT_ACTION: withdrawFromVaultAction, + TRADE_DELEGATED_DRIFT_VAULT_ACTION: tradeDelegatedDriftVaultAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/actions/mintNFT.ts b/src/actions/mintNFT.ts index f04cfb7..acee758 100644 --- a/src/actions/mintNFT.ts +++ b/src/actions/mintNFT.ts @@ -13,7 +13,7 @@ const mintNFTAction: Action = { "create token", "add nft to collection", ], - description: `Mint a new NFT in a collection on Solana blockchain.`, + description: "Mint a new NFT in a collection on Solana blockchain.", examples: [ [ { diff --git a/src/tools/drift_vault.ts b/src/tools/drift_vault.ts index 6d70bf3..dda6542 100644 --- a/src/tools/drift_vault.ts +++ b/src/tools/drift_vault.ts @@ -165,8 +165,8 @@ export async function createVault( .mul(PERCENTAGE_PRECISION) .div(new BN(100)) .toNumber(), - minDepositAmount: new BN(params.minDepositAmount).mul(spotPrecision), - redeemPeriod: new BN(params.redeemPeriod), + minDepositAmount: numberToSafeBN(params.minDepositAmount, spotPrecision), + redeemPeriod: new BN(params.redeemPeriod * 86400), maxTokens: new BN(params.maxTokens).mul(spotPrecision), managementFee: new BN(params.managementFee) .mul(PERCENTAGE_PRECISION) @@ -214,7 +214,11 @@ export async function updateVault( const vaultDetails = await vaultClient.getVault(vaultPublicKey); const tx = await vaultClient.managerUpdateVault(vaultPublicKey, { - redeemPeriod: new BN(params.redeemPeriod ?? vaultDetails.redeemPeriod), + redeemPeriod: new BN( + params.redeemPeriod + ? params.redeemPeriod * 86400 + : vaultDetails.redeemPeriod, + ), maxTokens: new BN(params.maxTokens ?? vaultDetails.maxTokens), minDepositAmount: new BN( params.minDepositAmount ?? vaultDetails.minDepositAmount, @@ -326,7 +330,10 @@ export async function requestWithdrawalFromVault( @param vault Vault address @returns Promise - The transaction signature of the redemption */ -export async function withdraw(agent: SolanaAgentKit, vault: string) { +export async function withdrawFromDriftVault( + agent: SolanaAgentKit, + vault: string, +) { try { const { vaultClient } = initClients(agent); const vaultPublicKey = new PublicKey(vault); @@ -353,7 +360,7 @@ export async function withdraw(agent: SolanaAgentKit, vault: string) { @param vault Vault address @returns Promise - Whether the vault is owned by the user */ -export async function getIsOwned(agent: SolanaAgentKit, vault: string) { +async function getIsOwned(agent: SolanaAgentKit, vault: string) { try { const { vaultClient } = initClients(agent); const vaultPublicKey = new PublicKey(vault); @@ -375,13 +382,13 @@ export async function getIsOwned(agent: SolanaAgentKit, vault: string) { @param type Type of trade (e.g. "market" or "limit") @param vault Vault address */ -export async function trade( +export async function tradeDriftVault( agent: SolanaAgentKit, + vault: string, amount: number, symbol: string, action: "buy" | "sell", type: "market" | "limit", - vault: string, price?: number, ) { try { diff --git a/src/tools/index.ts b/src/tools/index.ts index 2363e3a..f466f59 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -50,3 +50,5 @@ export * from "./flash_open_trade"; export * from "./flash_close_trade"; export * from "./create_3land_collectible"; + +export * from "./drift_vault"; From 2f83188cb9dbe86e6a3131189f6b4ea0e8c13aff Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 20:07:46 +0100 Subject: [PATCH 10/32] fix: add descriptions to some drift vault schemas --- src/actions/drift/createVault.ts | 60 ++++++++++++++++--- src/actions/drift/depositIntoVault.ts | 5 +- .../drift/requestWithdrawalFromVault.ts | 5 +- 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/actions/drift/createVault.ts b/src/actions/drift/createVault.ts index 8262f0a..c0702c3 100644 --- a/src/actions/drift/createVault.ts +++ b/src/actions/drift/createVault.ts @@ -11,7 +11,17 @@ const createDriftVaultAction: Action = { examples: [ [ { - input: {}, + input: { + name: "My Drift Vault", + marketName: "SOL-SPOT", + redeemPeriod: 30, + maxTokens: 1000, + minDepositAmount: 100, + managementFee: 10, + profitShare: 5, + hurdleRate: 0.1, + permissioned: false, + }, output: { status: "success", message: "Drift vault created successfully", @@ -23,15 +33,47 @@ const createDriftVaultAction: Action = { ], ], schema: z.object({ - name: z.string().min(5, "Name must be at least 5 characters"), + name: z + .string() + .min(5, "Name must be at least 5 characters") + .describe("Has to be unique. 2 Vaults can not have the same name."), // regex matches SOL-SPOT - marketName: z.string().regex(/^([A-Za-z0-9]{2,7})-SPOT$/), - redeemPeriod: z.number().int().min(1, "Redeem period must be at least 1"), - maxTokens: z.number().int().min(100, "Max tokens must be at least 100"), - minDepositAmount: z.number().positive(), - managementFee: z.number().positive().max(20), - profitShare: z.number().positive().max(90).optional().default(5), - handleRate: z.number().optional(), + marketName: z + .string() + .regex(/^([A-Za-z0-9]{2,7})-SPOT$/) + .describe('Market name must be in the format "TOKEN-SPOT"'), + redeemPeriod: z + .number() + .int() + .min(1, "Redeem period must be at least 1") + .describe( + "Number of days to wait before funds deposited in a vault can be redeemed ", + ), + maxTokens: z + .number() + .int() + .min(100, "Max tokens must be at least 100") + .describe( + "The maximum amount of tokens the vault will be accomodating. For example some vaults have a cap at 10 million USDC", + ), + minDepositAmount: z.number().positive().describe("Minimum deposit amount"), + managementFee: z + .number() + .positive() + .max(20) + .describe( + "How much of a fee you'll be taking to manage depositors funds. This is in percentage e.g 2 for 2%", + ), + profitShare: z + .number() + .positive() + .max(90) + .optional() + .default(5) + .describe( + "How much of the profit you'll be sharing with depositors. This is in percentage e.g 2 for 2%. Defaults to 5%", + ), + hurdleRate: z.number().optional(), permissioned: z .boolean() .optional() diff --git a/src/actions/drift/depositIntoVault.ts b/src/actions/drift/depositIntoVault.ts index 3c44bb3..5dcd477 100644 --- a/src/actions/drift/depositIntoVault.ts +++ b/src/actions/drift/depositIntoVault.ts @@ -26,7 +26,10 @@ const depositIntoDriftVaultAction: Action = { ], schema: z.object({ vaultAddress: z.string(), - amount: z.number().positive(), + amount: z + .number() + .positive() + .describe("The amount in tokens you'd like to deposit into the vault"), }), handler: async (agent: SolanaAgentKit, input) => { try { diff --git a/src/actions/drift/requestWithdrawalFromVault.ts b/src/actions/drift/requestWithdrawalFromVault.ts index 789c58d..1739803 100644 --- a/src/actions/drift/requestWithdrawalFromVault.ts +++ b/src/actions/drift/requestWithdrawalFromVault.ts @@ -26,7 +26,10 @@ const requestWithdrawalFromVaultAction: Action = { ], schema: z.object({ vaultAddress: z.string(), - amount: z.number().positive(), + amount: z + .number() + .positive() + .describe("Amount of shares you would like to withdraw from the vault"), }), handler: async (agent: SolanaAgentKit, input) => { try { From 8bef717eb9a50e4843f8ff78e2a788d90531c2c5 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 10 Jan 2025 23:26:14 +0100 Subject: [PATCH 11/32] feat: drift vault info action --- .eslintrc | 3 +- src/actions/drift/createVault.ts | 1 - src/actions/drift/vaultInfo.ts | 78 +++++++++++++++++++++++++++ src/actions/index.ts | 2 + src/tools/drift_vault.ts | 92 ++++++++++++++++++++++++++------ 5 files changed, 158 insertions(+), 18 deletions(-) create mode 100644 src/actions/drift/vaultInfo.ts diff --git a/.eslintrc b/.eslintrc index e619c84..3b8e4c6 100644 --- a/.eslintrc +++ b/.eslintrc @@ -13,6 +13,7 @@ "no-constant-condition": "off", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-object-type": "off", "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], "no-console": ["warn", { "allow": ["warn", "error"] }], "curly": ["error", "all"], @@ -30,4 +31,4 @@ "ecmaVersion": 2020, "sourceType": "module" } -} \ No newline at end of file +} diff --git a/src/actions/drift/createVault.ts b/src/actions/drift/createVault.ts index c0702c3..2296196 100644 --- a/src/actions/drift/createVault.ts +++ b/src/actions/drift/createVault.ts @@ -40,7 +40,6 @@ const createDriftVaultAction: Action = { // regex matches SOL-SPOT marketName: z .string() - .regex(/^([A-Za-z0-9]{2,7})-SPOT$/) .describe('Market name must be in the format "TOKEN-SPOT"'), redeemPeriod: z .number() diff --git a/src/actions/drift/vaultInfo.ts b/src/actions/drift/vaultInfo.ts new file mode 100644 index 0000000..c354ae5 --- /dev/null +++ b/src/actions/drift/vaultInfo.ts @@ -0,0 +1,78 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { getVaultInfo } from "../../tools"; +import type { SolanaAgentKit } from "../../agent"; +import { decodeName } from "@drift-labs/vaults-sdk"; +import { MainnetSpotMarkets, PERCENTAGE_PRECISION } from "@drift-labs/sdk"; + +const vaultInfoAction: Action = { + name: "DRIFT_VAULT_INFO", + similes: ["get drift vault info", "vault info", "vault information"], + description: "Get information about a drift vault", + examples: [ + [ + { + input: { + vaultAddress: "2nFeP7taii", + }, + output: { + status: "success", + message: "Vault info retrieved successfully", + data: { + name: "My Drift Vault", + marketName: "SOL-SPOT", + redeemPeriod: 30, + maxTokens: 1000, + minDepositAmount: 100, + managementFee: 10, + profitShare: 5, + hurdleRate: 0.1, + permissioned: false, + }, + }, + explanation: "Get information about a drift vault", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string(), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const vaultInfo = await getVaultInfo(agent, input.vaultAddress as string); + const spotToken = MainnetSpotMarkets[vaultInfo.spotMarketIndex]; + const data = { + name: decodeName(vaultInfo.name), + marketName: `${spotToken.symbol}-SPOT`, + redeemPeriod: vaultInfo.redeemPeriod.toNumber(), + maxTokens: vaultInfo.maxTokens.div(spotToken.precision).toNumber(), + minDepositAmount: vaultInfo.minDepositAmount + .div(spotToken.precision) + .toNumber(), + managementFee: + (vaultInfo.managementFee.toNumber() / + PERCENTAGE_PRECISION.toNumber()) * + 100, + profitShare: + (vaultInfo.profitShare / PERCENTAGE_PRECISION.toNumber()) * 100, + hurdleRate: + (vaultInfo.hurdleRate / PERCENTAGE_PRECISION.toNumber()) * 100, + permissioned: vaultInfo.permissioned, + }; + + return { + status: "success", + message: "Vault info retrieved successfully", + data, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to retrieve vault info: ${e.message}`, + }; + } + }, +}; + +export default vaultInfoAction; diff --git a/src/actions/index.ts b/src/actions/index.ts index 217d547..7baf94e 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -36,6 +36,7 @@ import depositIntoDriftVaultAction from "./drift/depositIntoVault"; import requestWithdrawalFromVaultAction from "./drift/requestWithdrawalFromVault"; import withdrawFromVaultAction from "./drift/withdrawFromVault"; import tradeDelegatedDriftVaultAction from "./drift/tradeDelegatedDriftVault"; +import vaultInfoAction from "./drift/vaultInfo"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -77,6 +78,7 @@ export const ACTIONS = { REQUEST_WITHDRAWAL_FROM_DRIFT_VAULT_ACTION: requestWithdrawalFromVaultAction, WITHDRAW_FROM_DRIFT_VAULT_ACTION: withdrawFromVaultAction, TRADE_DELEGATED_DRIFT_VAULT_ACTION: tradeDelegatedDriftVaultAction, + DRIFT_VAULT_INFO_ACTION: vaultInfoAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/tools/drift_vault.ts b/src/tools/drift_vault.ts index dda6542..54d56d7 100644 --- a/src/tools/drift_vault.ts +++ b/src/tools/drift_vault.ts @@ -6,6 +6,8 @@ import { getLimitOrderParams, getMarketOrderParams, getOrderParams, + MainnetPerpMarkets, + MainnetSpotMarkets, MarketType, numberToSafeBN, PERCENTAGE_PRECISION, @@ -33,7 +35,25 @@ import { import type { SolanaAgentKit } from "../agent"; import { BN } from "bn.js"; -function initClients(agent: SolanaAgentKit) { +export function getMarketIndexAndType(name: `${string}-${string}`) { + const [symbol, type] = name.toUpperCase().split("-"); + + if (type === "PERP") { + const token = MainnetPerpMarkets.find((v) => v.symbol === symbol); + if (!token) { + throw new Error("Drift doesn't have that market"); + } + return { marketIndex: token.marketIndex, marketType: MarketType.PERP }; + } + + const token = MainnetSpotMarkets.find((v) => v.symbol === symbol); + if (!token) { + throw new Error("Drift doesn't have that market"); + } + return { marketIndex: token.marketIndex, marketType: MarketType.SPOT }; +} + +async function initClients(agent: SolanaAgentKit) { const wallet: IWallet = { publicKey: agent.wallet.publicKey, payer: agent.wallet, @@ -76,12 +96,17 @@ function initClients(agent: SolanaAgentKit) { program: vaultProgram, cliMode: false, }); + await driftClient.subscribe(); - return { driftClient, vaultClient }; + async function cleanUp() { + await driftClient.unsubscribe(); + } + + return { driftClient, vaultClient, cleanUp }; } async function getOrCreateVaultDepositor(agent: SolanaAgentKit, vault: string) { - const { vaultClient } = initClients(agent); + const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const vaultDepositor = getVaultDepositorAddressSync( vaultClient.program.programId, @@ -91,12 +116,14 @@ async function getOrCreateVaultDepositor(agent: SolanaAgentKit, vault: string) { try { await vaultClient.getVaultDepositor(vaultDepositor); + await cleanUp(); return vaultDepositor; } catch (e) { // @ts-expect-error - error message is a string if (e.message === "Account not found") { await vaultClient.initializeVaultDepositor(vaultDepositor); } + await cleanUp(); return vaultDepositor; } } @@ -131,10 +158,8 @@ export async function createVault( }, ) { try { - const { vaultClient, driftClient } = initClients(agent); - const marketIndexAndType = driftClient.getMarketIndexAndType( - params.marketName, - ); + const { vaultClient, driftClient, cleanUp } = await initClients(agent); + const marketIndexAndType = getMarketIndexAndType(params.marketName); if (!marketIndexAndType) { throw new Error("Invalid market name"); @@ -174,6 +199,8 @@ export async function createVault( permissioned: params.permissioned ?? false, }); + await cleanUp(); + return tx; } catch (e) { // @ts-expect-error - error message is a string @@ -209,7 +236,7 @@ export async function updateVault( }, ) { try { - const { vaultClient } = initClients(agent); + const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const vaultDetails = await vaultClient.getVault(vaultPublicKey); @@ -233,6 +260,8 @@ export async function updateVault( permissioned: params.permissioned ?? vaultDetails.permissioned, }); + await cleanUp(); + return tx; } catch (e) { // @ts-expect-error - error message is a string @@ -240,6 +269,24 @@ export async function updateVault( } } +export async function getVaultInfo( + agent: SolanaAgentKit, + vaultAddress: string, +) { + try { + const { vaultClient, cleanUp } = await initClients(agent); + const vaultPublicKey = new PublicKey(vaultAddress); + const vaultDetails = await vaultClient.getVault(vaultPublicKey); + + await cleanUp(); + + return vaultDetails; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to get vault info: ${e.message}`); + } +} + /** Deposit tokens into a vault @param agent SolanaAgentKit instance @@ -252,8 +299,9 @@ export async function depositIntoVault( amount: number, vault: string, ) { + const { vaultClient, driftClient, cleanUp } = await initClients(agent); + try { - const { vaultClient, driftClient } = initClients(agent); const vaultPublicKey = new PublicKey(vault); const [isOwned, vaultDetails] = await Promise.all([ getIsOwned(agent, vault), @@ -275,8 +323,11 @@ export async function depositIntoVault( } const vaultDepositor = await getOrCreateVaultDepositor(agent, vault); + const tx = await vaultClient.deposit(vaultDepositor, amountBN); - return await vaultClient.deposit(vaultDepositor, amountBN); + await cleanUp(); + + return tx; } catch (e) { // @ts-expect-error - error message is a string throw new Error(`Failed to deposit into Drift vault: ${e.message}`); @@ -295,7 +346,7 @@ export async function requestWithdrawalFromVault( vault: string, ) { try { - const { vaultClient } = initClients(agent); + const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const isOwned = await getIsOwned(agent, vault); @@ -315,6 +366,8 @@ export async function requestWithdrawalFromVault( WithdrawUnit.SHARES, ); + await cleanUp(); + return tx; } catch (e) { throw new Error( @@ -335,7 +388,7 @@ export async function withdrawFromDriftVault( vault: string, ) { try { - const { vaultClient } = initClients(agent); + const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const isOwned = await getIsOwned(agent, vault); @@ -347,6 +400,8 @@ export async function withdrawFromDriftVault( const tx = await vaultClient.withdraw(vaultDepositor); + await cleanUp(); + return tx; } catch (e) { // @ts-expect-error - error message is a string @@ -362,11 +417,14 @@ export async function withdrawFromDriftVault( */ async function getIsOwned(agent: SolanaAgentKit, vault: string) { try { - const { vaultClient } = initClients(agent); + const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const vaultDetails = await vaultClient.getVault(vaultPublicKey); + const isOwned = vaultDetails.delegate.equals(agent.wallet.publicKey); - return vaultDetails.delegate.equals(agent.wallet.publicKey); + await cleanUp(); + + return isOwned; } catch (e) { // @ts-expect-error - error message is a string throw new Error(`Failed to check if vault is owned: ${e.message}`); @@ -392,7 +450,7 @@ export async function tradeDriftVault( price?: number, ) { try { - const { driftClient, vaultClient } = initClients(agent); + const { driftClient, vaultClient, cleanUp } = await initClients(agent); const [isOwned, vaultDetails, driftLookupTableAccount] = await Promise.all([ getIsOwned(agent, vault), vaultClient.getVault(new PublicKey(vault)), @@ -433,7 +491,7 @@ export async function tradeDriftVault( ); } - const perpMarketIndexAndType = driftClient.getMarketIndexAndType( + const perpMarketIndexAndType = getMarketIndexAndType( `${symbol.toUpperCase()}-PERP`, ); @@ -506,6 +564,8 @@ export async function tradeDriftVault( ), ); + await cleanUp(); + return tx; } catch (e) { // @ts-expect-error - error message is a string From 25f0f503cb14879d63ccefd0aa2ab5fd8402a97e Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Sun, 12 Jan 2025 01:33:11 +0100 Subject: [PATCH 12/32] feat: drift perp trade, account creation, withdraw, and deposit --- src/actions/drift/createDriftUserAccount.ts | 59 +++ src/actions/drift/depositIntoVault.ts | 3 +- .../drift/depositToDriftUserAccount.ts | 84 +++++ src/actions/drift/doesUserHaveDriftAccount.ts | 53 +++ src/actions/drift/tradePerpAccount.ts | 79 ++++ src/actions/drift/withdrawFromDriftAccount.ts | 65 ++++ src/actions/index.ts | 10 + src/tools/drift.ts | 344 ++++++++++++++++++ src/tools/drift_vault.ts | 117 +++--- src/tools/index.ts | 1 + 10 files changed, 738 insertions(+), 77 deletions(-) create mode 100644 src/actions/drift/createDriftUserAccount.ts create mode 100644 src/actions/drift/depositToDriftUserAccount.ts create mode 100644 src/actions/drift/doesUserHaveDriftAccount.ts create mode 100644 src/actions/drift/tradePerpAccount.ts create mode 100644 src/actions/drift/withdrawFromDriftAccount.ts create mode 100644 src/tools/drift.ts diff --git a/src/actions/drift/createDriftUserAccount.ts b/src/actions/drift/createDriftUserAccount.ts new file mode 100644 index 0000000..32c62ef --- /dev/null +++ b/src/actions/drift/createDriftUserAccount.ts @@ -0,0 +1,59 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { createDriftUserAccount } from "../../tools"; + +const createDriftUserAccountAction: Action = { + name: "CREATE_DRIFT_USER_ACCOUNT", + similes: [ + "create drift account", + "create drift user account", + "create user account on drift", + ], + description: "Create a new user account on Drift protocol", + examples: [ + [ + { + input: { + amount: 100, + symbol: "SOL", + }, + output: { + status: "success", + message: "User account created with 100 SOL successfully deposited", + account: "4xKpN2...", + }, + explanation: "Create a new user account with 100 SOL", + }, + ], + ], + schema: z.object({ + amount: z.number().positive().describe("Amount of the token to deposit"), + symbol: z.string().describe("Symbol of the token to deposit"), + }), + handler: async (agent, input) => { + try { + const res = await createDriftUserAccount( + agent, + input.amount, + input.symbol, + ); + + return { + status: "success", + message: + res.message ?? + `User account created with ${input.amount} ${input.symobl} successfully deposited.`, + account: res.account, + signature: res.txSignature, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message is a string + message: `Failed to create user account: ${e.message}`, + }; + } + }, +}; + +export default createDriftUserAccountAction; diff --git a/src/actions/drift/depositIntoVault.ts b/src/actions/drift/depositIntoVault.ts index 5dcd477..c2ba8ee 100644 --- a/src/actions/drift/depositIntoVault.ts +++ b/src/actions/drift/depositIntoVault.ts @@ -1,6 +1,5 @@ import { z } from "zod"; import type { Action } from "../../types"; -import type { SolanaAgentKit } from "../../agent"; import { depositIntoVault } from "../../tools/drift_vault"; const depositIntoDriftVaultAction: Action = { @@ -31,7 +30,7 @@ const depositIntoDriftVaultAction: Action = { .positive() .describe("The amount in tokens you'd like to deposit into the vault"), }), - handler: async (agent: SolanaAgentKit, input) => { + handler: async (agent, input) => { try { const tx = await depositIntoVault( agent, diff --git a/src/actions/drift/depositToDriftUserAccount.ts b/src/actions/drift/depositToDriftUserAccount.ts new file mode 100644 index 0000000..d58aa7c --- /dev/null +++ b/src/actions/drift/depositToDriftUserAccount.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; +import type { SolanaAgentKit } from "../../agent"; +import type { Action } from "../../types"; +import { depositToDriftUserAccount } from "../../tools"; + +const depositToDriftUserAccountAction: Action = { + name: "DEPOSIT_TO_DRIFT_USER_ACCOUNT", + description: "Deposit funds into your drift user account", + similes: [ + "deposit into drift user account", + "add funds to drift user account", + "add funds to my drift account", + ], + examples: [ + [ + { + input: { + amount: 100, + symbol: "usdc", + }, + output: { + status: "success", + message: "Funds deposited successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Deposit 100 USDC into your drift user account", + }, + ], + [ + { + input: { + amount: 100, + symbol: "USDC", + address: "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBD", + }, + output: { + status: "success", + message: "Funds deposited successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Deposit 100 USDC into a drift user account", + }, + ], + ], + schema: z.object({ + amount: z + .number() + .positive() + .describe( + "The amount in tokens you'd like to deposit into your drift user account", + ), + symbol: z + .string() + .toUpperCase() + .describe("The symbol of the token you'd like to deposit"), + address: z.string().optional().describe("The drift user account address"), + }), + handler: async (agent: SolanaAgentKit, input) => { + try { + const tx = await depositToDriftUserAccount( + agent, + input.amount as number, + input.symbol as string, + input.address, + ); + + return { + status: "success", + message: "Funds deposited successfully", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to deposit funds: ${e.message}`, + }; + } + }, +}; + +export default depositToDriftUserAccountAction; diff --git a/src/actions/drift/doesUserHaveDriftAccount.ts b/src/actions/drift/doesUserHaveDriftAccount.ts new file mode 100644 index 0000000..3cf7084 --- /dev/null +++ b/src/actions/drift/doesUserHaveDriftAccount.ts @@ -0,0 +1,53 @@ +import { z } from "zod"; +import { doesUserHaveDriftAccount } from "../../tools"; +import type { Action } from "../../types"; + +export const doesUserHaveDriftAccountAction: Action = { + name: "DOES_USER_HAVE_DRIFT_ACCOUNT", + description: "Check if a user has a Drift account", + similes: [ + "check if user has drift account", + "check if user has account on drift", + "do I have an account on drift", + ], + examples: [ + [ + { + input: {}, + output: { + status: "success", + message: "Nice! You have a Drift account", + account: "4xKpN2...", + }, + explanation: "Check if a user has a Drift account", + }, + ], + ], + schema: z.object({}), + handler: async (agent) => { + try { + const res = await doesUserHaveDriftAccount(agent); + + if (!res.hasAccount) { + return { + status: "error", + message: "You do not have a Drift account", + }; + } + + return { + status: "success", + message: "Nice! You have a Drift account", + account: res.account, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message is a string + message: `Failed to check if you have a Drift account: ${e.message}`, + }; + } + }, +}; + +export default doesUserHaveDriftAccountAction; diff --git a/src/actions/drift/tradePerpAccount.ts b/src/actions/drift/tradePerpAccount.ts new file mode 100644 index 0000000..5868020 --- /dev/null +++ b/src/actions/drift/tradePerpAccount.ts @@ -0,0 +1,79 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { driftPerpTrade } from "../../tools"; + +export const tradeDriftPerpAccountAction: Action = { + name: "TRADE_DRIFT_PERP_ACCOUNT", + similes: [ + "trade drift perp account", + "trade drift perp", + "trade drift perpetual account", + "trade perp account", + "trade account", + ], + description: "Trade a perpetual account on Drift protocol", + examples: [ + [ + { + input: { + amount: 100, + symbol: "SOL", + action: "long", + type: "market", + }, + output: { + status: "success", + message: "Trade successful", + }, + explanation: "Open a $100 long position on SOL.", + }, + ], + [ + { + input: { + amount: 50, + symbol: "BTC", + action: "short", + type: "limit", + price: 50000, + }, + output: { + status: "success", + message: "Trade successful", + }, + explanation: "$50 short position on BTC at $50,000.", + }, + ], + ], + schema: z.object({ + amount: z.number().positive(), + symbol: z.string().min(3).max(10), + action: z.enum(["long", "short"]), + type: z.enum(["market", "limit"]), + price: z.number().positive().optional(), + }), + handler: async (agent, input) => { + try { + const signature = await driftPerpTrade(agent, { + action: input.action, + amount: input.amount, + symbol: input.symbol, + type: input.type, + price: input.price, + }); + + return { + status: "success", + signature: signature, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message is a string + message: `Failed to trade perp account: ${e.message}`, + }; + } + }, +}; + +export default tradeDriftPerpAccountAction; diff --git a/src/actions/drift/withdrawFromDriftAccount.ts b/src/actions/drift/withdrawFromDriftAccount.ts new file mode 100644 index 0000000..552329c --- /dev/null +++ b/src/actions/drift/withdrawFromDriftAccount.ts @@ -0,0 +1,65 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { withdrawFromDriftUserAccount } from "../../tools"; + +const withdrawFromDriftAccountAction: Action = { + name: "WITHDRAW_FROM_DRIFT_ACCOUNT", + description: "Withdraw funds from your drift account", + similes: [ + "withdraw from drift account", + "withdraw funds from drift account", + "withdraw funds from my drift account", + ], + examples: [ + [ + { + input: { + amount: 100, + symbol: "usdc", + }, + output: { + status: "success", + message: "Funds withdrawn successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Withdraw 100 USDC from your drift account", + }, + ], + ], + schema: z.object({ + amount: z + .number() + .positive() + .describe( + "The amount in tokens you'd like to withdraw from your drift account", + ), + symbol: z + .string() + .toUpperCase() + .describe("The symbol of the token you'd like to withdraw"), + }), + handler: async (agent, input) => { + try { + const tx = await withdrawFromDriftUserAccount( + agent, + input.amount, + input.symbol, + ); + + return { + status: "success", + message: "Funds withdrawn successfully", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message is a string + message: `Failed to withdraw funds: ${e.message}`, + }; + } + }, +}; + +export default withdrawFromDriftAccountAction; diff --git a/src/actions/index.ts b/src/actions/index.ts index 7baf94e..6c675d1 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -37,6 +37,11 @@ import requestWithdrawalFromVaultAction from "./drift/requestWithdrawalFromVault import withdrawFromVaultAction from "./drift/withdrawFromVault"; import tradeDelegatedDriftVaultAction from "./drift/tradeDelegatedDriftVault"; import vaultInfoAction from "./drift/vaultInfo"; +import createDriftUserAccountAction from "./drift/createDriftUserAccount"; +import tradeDriftPerpAccountAction from "./drift/tradePerpAccount"; +import doesUserHaveDriftAccountAction from "./drift/doesUserHaveDriftAccount"; +import depositToDriftUserAccountAction from "./drift/depositToDriftUserAccount"; +import withdrawFromDriftAccountAction from "./drift/withdrawFromDriftAccount"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -79,6 +84,11 @@ export const ACTIONS = { WITHDRAW_FROM_DRIFT_VAULT_ACTION: withdrawFromVaultAction, TRADE_DELEGATED_DRIFT_VAULT_ACTION: tradeDelegatedDriftVaultAction, DRIFT_VAULT_INFO_ACTION: vaultInfoAction, + CREATE_DRIFT_USER_ACCOUNT_ACTION: createDriftUserAccountAction, + TRADE_DRIFT_PERP_ACCOUNT_ACTION: tradeDriftPerpAccountAction, + DOES_USER_HAVE_DRIFT_ACCOUNT_ACTION: doesUserHaveDriftAccountAction, + DEPOSIT_TO_DRIFT_USER_ACCOUNT_ACTION: depositToDriftUserAccountAction, + WITHDRAW_FROM_DRIFT_ACCOUNT_ACTION: withdrawFromDriftAccountAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/tools/drift.ts b/src/tools/drift.ts new file mode 100644 index 0000000..a7240aa --- /dev/null +++ b/src/tools/drift.ts @@ -0,0 +1,344 @@ +import { + BASE_PRECISION, + convertToNumber, + DRIFT_PROGRAM_ID, + DriftClient, + FastSingleTxSender, + getLimitOrderParams, + getMarketOrderParams, + getUserAccountPublicKeySync, + MainnetSpotMarkets, + numberToSafeBN, + PositionDirection, + PostOnlyParams, + PRICE_PRECISION, + User, + type IWallet, +} from "@drift-labs/sdk"; +import type { SolanaAgentKit } from "../agent"; +import * as anchor from "@coral-xyz/anchor"; +import { IDL, VAULT_PROGRAM_ID, VaultClient } from "@drift-labs/vaults-sdk"; +import { BN } from "bn.js"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; +import { PublicKey } from "@solana/web3.js"; + +export async function initClients(agent: SolanaAgentKit) { + const wallet: IWallet = { + publicKey: agent.wallet.publicKey, + payer: agent.wallet, + signAllTransactions: async (txs) => { + for (const tx of txs) { + tx.sign(agent.wallet); + } + return txs; + }, + signTransaction: async (tx) => { + tx.sign(agent.wallet); + return tx; + }, + }; + + const driftClient = new DriftClient({ + connection: agent.connection, + wallet, + env: "mainnet-beta", + txSender: new FastSingleTxSender({ + connection: agent.connection, + wallet, + timeout: 30000, + blockhashRefreshInterval: 1000, + opts: { + commitment: agent.connection.commitment ?? "confirmed", + skipPreflight: false, + preflightCommitment: agent.connection.commitment ?? "confirmed", + }, + }), + }); + const vaultProgram = new anchor.Program( + IDL, + VAULT_PROGRAM_ID, + driftClient.provider, + ); + const vaultClient = new VaultClient({ + driftClient, + // @ts-expect-error - type mismatch due to different dep versions + program: vaultProgram, + cliMode: false, + }); + await driftClient.subscribe(); + + async function cleanUp() { + await driftClient.unsubscribe(); + } + + return { driftClient, vaultClient, cleanUp }; +} + +/** + * Create a drift user account provided an amount + * @param amount amount of the token to deposit + * @param symbol symbol of the token to deposit + */ +export async function createDriftUserAccount( + agent: SolanaAgentKit, + amount: number, + symbol: string, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const user = new User({ + driftClient, + userAccountPublicKey: getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + agent.wallet.publicKey, + ), + }); + const userAccountExists = await user.exists(); + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error(`Token with symbol ${symbol} not found`); + } + + if (!userAccountExists) { + const depositAmount = new BN(amount).mul(token.precision); + const [txSignature, account] = + await driftClient.initializeUserAccountAndDepositCollateral( + depositAmount, + getAssociatedTokenAddressSync(token.mint, agent.wallet.publicKey), + ); + + await cleanUp(); + return { txSignature, account }; + } + + await cleanUp(); + return { + message: "User account already exists", + account: user.userAccountPublicKey, + }; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to create user account: ${e.message}`); + } +} + +/** + * Deposit to your drift user account + * @param agent + * @param amount + * @param symbol + * @param address + * @returns + */ +export async function depositToDriftUserAccount( + agent: SolanaAgentKit, + amount: number, + symbol: string, + address?: string, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const publicKey = address ? new PublicKey(address) : agent.wallet.publicKey; + const user = new User({ + driftClient, + userAccountPublicKey: getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + publicKey, + ), + }); + const userAccountExists = await user.exists(); + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error(`Token with symbol ${symbol} not found`); + } + + if (!userAccountExists) { + throw new Error("You need to create a Drift user account first."); + } + + const depositAmount = new BN(amount).mul(token.precision); + const txSignature = await driftClient.deposit( + depositAmount, + token.marketIndex, + getAssociatedTokenAddressSync(token.mint, publicKey), + ); + + await cleanUp(); + return txSignature; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to deposit to user account: ${e.message}`); + } +} + +export async function withdrawFromDriftUserAccount( + agent: SolanaAgentKit, + amount: number, + symbol: string, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const user = new User({ + driftClient, + userAccountPublicKey: getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + agent.wallet.publicKey, + ), + }); + const userAccountExists = await user.exists(); + + if (!userAccountExists) { + throw new Error("You need to create a Drift user account first."); + } + + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error(`Token with symbol ${symbol} not found`); + } + + const withdrawAmount = numberToSafeBN(amount, token.precision); + + const txSignature = await driftClient.withdraw( + withdrawAmount, + token.marketIndex, + getAssociatedTokenAddressSync(token.mint, agent.wallet.publicKey), + ); + + await cleanUp(); + return txSignature; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to withdraw from user account: ${e.message}`); + } +} + +/** + * Open a perpetual trade on drift + * @param agent + * @param params.amount + * @param params.symbol + * @param params.action + * @param params.type + * @param params.price this should only be supplied if type is limit + * @param params.reduceOnly + */ +export async function driftPerpTrade( + agent: SolanaAgentKit, + params: { + amount: number; + symbol: string; + action: "long" | "short"; + type: "market" | "limit"; + price?: number; + }, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const user = new User({ + driftClient, + userAccountPublicKey: getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + agent.wallet.publicKey, + ), + }); + const userAccountExists = await user.exists(); + + if (!userAccountExists) { + throw new Error("You need to create a Drift user account first."); + } + + const market = driftClient.getMarketIndexAndType( + `${params.symbol.toUpperCase()}-PERP`, + ); + + if (!market) { + throw new Error(`Token with symbol ${params.symbol} not found`); + } + + const baseAssetPrice = driftClient.getOracleDataForPerpMarket( + market.marketIndex, + ); + const convertedAmount = + params.amount / convertToNumber(baseAssetPrice.price, PRICE_PRECISION); + + let signature: anchor.web3.TransactionSignature; + + if (params.type === "limit") { + if (!params.price) { + throw new Error("Price is required for limit orders"); + } + + signature = await driftClient.placePerpOrder( + getLimitOrderParams({ + baseAssetAmount: numberToSafeBN(convertedAmount, BASE_PRECISION), + reduceOnly: false, + direction: + params.action === "long" + ? PositionDirection.LONG + : PositionDirection.SHORT, + marketIndex: market.marketIndex, + price: numberToSafeBN(params.price, PRICE_PRECISION), + postOnly: PostOnlyParams.SLIDE, + }), + ); + } else { + signature = await driftClient.placePerpOrder( + getMarketOrderParams({ + baseAssetAmount: numberToSafeBN(convertedAmount, BASE_PRECISION), + reduceOnly: false, + direction: + params.action === "long" + ? PositionDirection.LONG + : PositionDirection.SHORT, + marketIndex: market.marketIndex, + }), + ); + } + + if (!signature) { + throw new Error("Failed to place order. Please make sure "); + } + + await cleanUp(); + return signature; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to place order: ${e.message}`); + } +} + +/** + * Check if a user has a drift account + * @param agent + */ +export async function doesUserHaveDriftAccount(agent: SolanaAgentKit) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const user = new User({ + driftClient, + userAccountPublicKey: getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + agent.wallet.publicKey, + ), + }); + user.getActivePerpPositions(); + const userAccountExists = await user.exists(); + await cleanUp(); + return { + hasAccount: userAccountExists, + account: user.userAccountPublicKey, + }; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to check user account: ${e.message}`); + } +} diff --git a/src/tools/drift_vault.ts b/src/tools/drift_vault.ts index 54d56d7..200c6ef 100644 --- a/src/tools/drift_vault.ts +++ b/src/tools/drift_vault.ts @@ -1,8 +1,6 @@ import { BASE_PRECISION, convertToNumber, - DriftClient, - FastSingleTxSender, getLimitOrderParams, getMarketOrderParams, getOrderParams, @@ -16,17 +14,12 @@ import { PRICE_PRECISION, QUOTE_PRECISION, TEN, - type IWallet, } from "@drift-labs/sdk"; import { - VAULT_PROGRAM_ID, - VaultClient, - IDL, WithdrawUnit, encodeName, getVaultDepositorAddressSync, } from "@drift-labs/vaults-sdk"; -import * as anchor from "@coral-xyz/anchor"; import { ComputeBudgetProgram, PublicKey, @@ -34,6 +27,7 @@ import { } from "@solana/web3.js"; import type { SolanaAgentKit } from "../agent"; import { BN } from "bn.js"; +import { initClients } from "./drift"; export function getMarketIndexAndType(name: `${string}-${string}`) { const [symbol, type] = name.toUpperCase().split("-"); @@ -53,58 +47,6 @@ export function getMarketIndexAndType(name: `${string}-${string}`) { return { marketIndex: token.marketIndex, marketType: MarketType.SPOT }; } -async function initClients(agent: SolanaAgentKit) { - const wallet: IWallet = { - publicKey: agent.wallet.publicKey, - payer: agent.wallet, - signAllTransactions: async (txs) => { - for (const tx of txs) { - tx.sign(agent.wallet); - } - return txs; - }, - signTransaction: async (tx) => { - tx.sign(agent.wallet); - return tx; - }, - }; - - const driftClient = new DriftClient({ - connection: agent.connection, - wallet, - env: "mainnet-beta", - txSender: new FastSingleTxSender({ - connection: agent.connection, - wallet, - timeout: 30000, - blockhashRefreshInterval: 1000, - opts: { - commitment: agent.connection.commitment ?? "confirmed", - skipPreflight: false, - preflightCommitment: agent.connection.commitment ?? "confirmed", - }, - }), - }); - const vaultProgram = new anchor.Program( - IDL, - VAULT_PROGRAM_ID, - driftClient.provider, - ); - const vaultClient = new VaultClient({ - driftClient, - // @ts-expect-error - type mismatch due to different dep versions - program: vaultProgram, - cliMode: false, - }); - await driftClient.subscribe(); - - async function cleanUp() { - await driftClient.unsubscribe(); - } - - return { driftClient, vaultClient, cleanUp }; -} - async function getOrCreateVaultDepositor(agent: SolanaAgentKit, vault: string) { const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); @@ -236,27 +178,49 @@ export async function updateVault( }, ) { try { - const { vaultClient, cleanUp } = await initClients(agent); + const { vaultClient, cleanUp, driftClient } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const vaultDetails = await vaultClient.getVault(vaultPublicKey); + const spotMarket = driftClient.getSpotMarketAccount( + vaultDetails.spotMarketIndex, + ); + + if (!spotMarket) { + throw new Error("Market not found"); + } + + const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); + const tx = await vaultClient.managerUpdateVault(vaultPublicKey, { redeemPeriod: new BN( params.redeemPeriod ? params.redeemPeriod * 86400 : vaultDetails.redeemPeriod, ), - maxTokens: new BN(params.maxTokens ?? vaultDetails.maxTokens), - minDepositAmount: new BN( - params.minDepositAmount ?? vaultDetails.minDepositAmount, - ), - managementFee: new BN(params.managementFee ?? vaultDetails.managementFee), - profitShare: new BN( - params.profitShare ?? vaultDetails.profitShare, - ).toNumber(), - hurdleRate: new BN( - params.hurdleRate ?? vaultDetails.hurdleRate, - ).toNumber(), + maxTokens: params.maxTokens + ? numberToSafeBN(params.maxTokens, spotPrecision) + : vaultDetails.maxTokens, + minDepositAmount: params.minDepositAmount + ? numberToSafeBN(params.minDepositAmount, spotPrecision) + : vaultDetails.minDepositAmount, + managementFee: params.managementFee + ? new BN(params.managementFee) + .mul(PERCENTAGE_PRECISION) + .div(new BN(100)) + : vaultDetails.managementFee, + profitShare: params.profitShare + ? new BN(params.profitShare) + .mul(PERCENTAGE_PRECISION) + .div(new BN(100)) + .toNumber() + : vaultDetails.profitShare, + hurdleRate: params.hurdleRate + ? new BN(params.hurdleRate) + .mul(PERCENTAGE_PRECISION) + .div(new BN(100)) + .toNumber() + : vaultDetails.hurdleRate, permissioned: params.permissioned ?? vaultDetails.permissioned, }); @@ -494,15 +458,18 @@ export async function tradeDriftVault( const perpMarketIndexAndType = getMarketIndexAndType( `${symbol.toUpperCase()}-PERP`, ); + const perpMarketAccount = driftClient.getPerpMarketAccount( + perpMarketIndexAndType.marketIndex, + ); - if (!perpMarketIndexAndType) { + if (!perpMarketIndexAndType || !perpMarketAccount) { throw new Error( "Invalid symbol: Drift doesn't have a market for this token", ); } const perpOracle = driftClient.getOracleDataForPerpMarket( - perpMarketIndexAndType.marketIndex, + perpMarketAccount.marketIndex, ); const oraclePriceNumber = convertToNumber( perpOracle.price, @@ -530,7 +497,7 @@ export async function tradeDriftVault( action === "buy" ? PositionDirection.LONG : PositionDirection.SHORT, - marketIndex: perpMarketIndexAndType.marketIndex, + marketIndex: perpMarketAccount.marketIndex, postOnly: PostOnlyParams.SLIDE, }), ), @@ -548,7 +515,7 @@ export async function tradeDriftVault( action === "buy" ? PositionDirection.LONG : PositionDirection.SHORT, - marketIndex: perpMarketIndexAndType.marketIndex, + marketIndex: perpMarketAccount.marketIndex, }), ), ]); diff --git a/src/tools/index.ts b/src/tools/index.ts index f466f59..c231a58 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -52,3 +52,4 @@ export * from "./flash_close_trade"; export * from "./create_3land_collectible"; export * from "./drift_vault"; +export * from "./drift"; From 33737f8bef36abd1d6e3de1dd5368f6e8f25dea4 Mon Sep 17 00:00:00 2001 From: zhourunlai Date: Thu, 2 Jan 2025 19:28:56 +0800 Subject: [PATCH 13/32] lend and withdraw asset with lulo, not only usdc --- .env.example | 3 +- src/actions/index.ts | 4 ++ src/actions/lulo/luloLend.ts | 62 ++++++++++++++++++++++++++ src/actions/lulo/luloWithdraw.ts | 62 ++++++++++++++++++++++++++ src/agent/index.ts | 10 +++++ src/langchain/index.ts | 4 ++ src/langchain/lulo/index.ts | 2 + src/langchain/lulo/lulo_lend.ts | 37 ++++++++++++++++ src/langchain/lulo/lulo_withdraw.ts | 37 ++++++++++++++++ src/tools/lulo/index.ts | 2 + src/tools/lulo/lulo_lend.ts | 64 ++++++++++++++++++++++++++ src/tools/lulo/lulo_withdraw.ts | 69 +++++++++++++++++++++++++++++ src/types/index.ts | 1 + 13 files changed, 356 insertions(+), 1 deletion(-) create mode 100644 src/actions/lulo/luloLend.ts create mode 100644 src/actions/lulo/luloWithdraw.ts create mode 100644 src/langchain/lulo/lulo_lend.ts create mode 100644 src/langchain/lulo/lulo_withdraw.ts create mode 100644 src/tools/lulo/lulo_lend.ts create mode 100644 src/tools/lulo/lulo_withdraw.ts diff --git a/.env.example b/.env.example index 52fdf99..b37c8d3 100644 --- a/.env.example +++ b/.env.example @@ -3,4 +3,5 @@ RPC_URL= SOLANA_PRIVATE_KEY= JUPITER_REFERRAL_ACCOUNT= JUPITER_FEE_BPS= -FLASH_PRIVILEGE= referral | nft | none \ No newline at end of file +FLASH_PRIVILEGE= referral | nft | none +FLEXLEND_API_KEY= diff --git a/src/actions/index.ts b/src/actions/index.ts index e878aa1..c7616db 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -13,6 +13,8 @@ import stakeWithJupAction from "./jupiter/stakeWithJup"; import stakeWithSolayerAction from "./solayer/stakeWithSolayer"; import registerDomainAction from "./sns/registerDomain"; import lendAssetAction from "./lulo/lendAsset"; +import luloLendAction from "./lulo/luloLend"; +import luloWithdrawAction from "./lulo/luloWithdraw"; import createGibworkTaskAction from "./gibwork/createGibworkTask"; import resolveSolDomainAction from "./sns/resolveSolDomain"; import pythFetchPriceAction from "./pyth/pythFetchPrice"; @@ -48,6 +50,8 @@ export const ACTIONS = { STAKE_WITH_SOLAYER_ACTION: stakeWithSolayerAction, REGISTER_DOMAIN_ACTION: registerDomainAction, LEND_ASSET_ACTION: lendAssetAction, + LULO_LEND_ACTION: luloLendAction, + LULO_WITHDRAW_ACTION: luloWithdrawAction, CREATE_GIBWORK_TASK_ACTION: createGibworkTaskAction, RESOLVE_SOL_DOMAIN_ACTION: resolveSolDomainAction, PYTH_FETCH_PRICE_ACTION: pythFetchPriceAction, diff --git a/src/actions/lulo/luloLend.ts b/src/actions/lulo/luloLend.ts new file mode 100644 index 0000000..937930c --- /dev/null +++ b/src/actions/lulo/luloLend.ts @@ -0,0 +1,62 @@ +import { Action } from "../../types/action"; +import { SolanaAgentKit } from "../../agent"; +import { z } from "zod"; +import { luloLend } from "../../tools/lulo"; + +const luloLendAction: Action = { + name: "LULO_LEND", + similes: [ + "lend USDC with lulo", + "lend PYUSD with lulo", + "lend USDS with lulo", + "lend USDT with lulo", + "lend SQL with lulo", + "lend jitoSQL with lulo", + "lend bSQL with lulo", + "lend mSQL with lulo", + "lend BONK with lulo", + "lend JUP with lulo", + ], + description: "Lend SPL tokens using Lulo protocol", + examples: [ + [ + { + input: { + mintAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + amount: 100, + }, + output: { + status: "success", + signature: "4xKpN2...", + message: "Successfully lend 100 USDC", + }, + explanation: "Lend 100 USDC on Lulo", + }, + ], + ], + schema: z.object({ + mintAddress: z.string().describe("SPL Mint address"), + amount: z.number().positive().describe("Amount to lend"), + }), + handler: async (agent: SolanaAgentKit, input: Record) => { + try { + const mintAddress = input.mintAddress as string; + const amount = input.amount as number; + + const response = await luloLend(agent, mintAddress, amount); + + return { + status: "success", + signature: response, + message: `Successfully lend ${amount} of token ${mintAddress}`, + }; + } catch (error: any) { + return { + status: "error", + message: `Lend failed: ${error.message}`, + }; + } + }, +}; + +export default luloLendAction; diff --git a/src/actions/lulo/luloWithdraw.ts b/src/actions/lulo/luloWithdraw.ts new file mode 100644 index 0000000..6c70933 --- /dev/null +++ b/src/actions/lulo/luloWithdraw.ts @@ -0,0 +1,62 @@ +import { Action } from "../../types/action"; +import { SolanaAgentKit } from "../../agent"; +import { z } from "zod"; +import { luloWithdraw } from "../../tools/lulo"; + +const luloWithdrawAction: Action = { + name: "LULO_WITHDRAW", + similes: [ + "withdraw USDC with lulo", + "withdraw PYUSD with lulo", + "withdraw USDS with lulo", + "withdraw USDT with lulo", + "withdraw SQL with lulo", + "withdraw jitoSQL with lulo", + "withdraw bSQL with lulo", + "withdraw mSQL with lulo", + "withdraw BONK with lulo", + "withdraw JUP with lulo", + ], + description: "Withdraw SPL tokens using Lulo protocol", + examples: [ + [ + { + input: { + mintAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + amount: 100, + }, + output: { + status: "success", + signature: "4xKpN2...", + message: "Successfully withdraw 100 USDC", + }, + explanation: "Withdraw 100 USDC on Lulo", + }, + ], + ], + schema: z.object({ + mintAddress: z.string().describe("SPL Mint address"), + amount: z.number().positive().describe("Amount to lend"), + }), + handler: async (agent: SolanaAgentKit, input: Record) => { + try { + const mintAddress = input.mintAddress as string; + const amount = input.amount as number; + + const response = await luloWithdraw(agent, mintAddress, amount); + + return { + status: "success", + signature: response, + message: `Successfully withdraw ${amount} of token ${mintAddress}`, + }; + } catch (error: any) { + return { + status: "error", + message: `Withdraw failed: ${error.message}`, + }; + } + }, +}; + +export default luloWithdrawAction; diff --git a/src/agent/index.ts b/src/agent/index.ts index 25037c9..c9bb575 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -14,6 +14,8 @@ import { getPrimaryDomain, launchPumpFunToken, lendAsset, + luloLend, + luloWithdraw, mintCollectionNFT, openbookCreateMarket, manifestCreateMarket, @@ -275,6 +277,14 @@ export class SolanaAgentKit { return lendAsset(this, amount); } + async luloLend(mintAddress: string, amount: number): Promise { + return luloLend(this, mintAddress, amount); + } + + async luloWithdraw(mintAddress: string, amount: number): Promise { + return luloWithdraw(this, mintAddress, amount); + } + async getTPS(): Promise { return getTPS(this); } diff --git a/src/langchain/index.ts b/src/langchain/index.ts index c2e5aff..7d9f96b 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -39,6 +39,8 @@ import { SolanaPumpfunTokenLaunchTool, SolanaCreateImageTool, SolanaLendAssetTool, + SolanaLuloLendTool, + SolanaLuloWithdrawTool, SolanaTPSCalculatorTool, SolanaStakeTool, SolanaRestakeTool, @@ -100,6 +102,8 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaPumpfunTokenLaunchTool(solanaKit), new SolanaCreateImageTool(solanaKit), new SolanaLendAssetTool(solanaKit), + new SolanaLuloLendTool(solanaKit), + new SolanaLuloWithdrawTool(solanaKit), new SolanaTPSCalculatorTool(solanaKit), new SolanaStakeTool(solanaKit), new SolanaRestakeTool(solanaKit), diff --git a/src/langchain/lulo/index.ts b/src/langchain/lulo/index.ts index f4ecf39..e31add1 100644 --- a/src/langchain/lulo/index.ts +++ b/src/langchain/lulo/index.ts @@ -1 +1,3 @@ export * from "./lend_asset"; +export * from "./lulo_lend"; +export * from "./lulo_withdraw"; diff --git a/src/langchain/lulo/lulo_lend.ts b/src/langchain/lulo/lulo_lend.ts new file mode 100644 index 0000000..0d5371e --- /dev/null +++ b/src/langchain/lulo/lulo_lend.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaLuloLendTool extends Tool { + name = "solana_lulo_lend"; + description = `Lend token for yield using Lulo. (support USDC/PYUSD/USDS/USDT/SOL/jitoSOL/bSOL/mSOL/BONK/JUP) + Inputs: + mintAddress: string, eg "So11111111111111111111111111111111111111112" (required) + amount: number, eg 1, 0.01 (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const mintAddress = parsedInput.mintAddress + const amount = parsedInput.amount; + + const tx = await this.solanaKit.luloLend(mintAddress, amount); + + return JSON.stringify({ + status: "success", + message: "Asset lent successfully", + transaction: tx, + amount, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } + } \ No newline at end of file diff --git a/src/langchain/lulo/lulo_withdraw.ts b/src/langchain/lulo/lulo_withdraw.ts new file mode 100644 index 0000000..fe2671d --- /dev/null +++ b/src/langchain/lulo/lulo_withdraw.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaLuloWithdrawTool extends Tool { + name = "solana_lulo_withdraw"; + description = `Withdraw token USDC using Lulo. (support USDC/PYUSD/USDS/USDT/SOL/jitoSOL/bSOL/mSOL/BONK/JUP) + Inputs (input is a json string): + mintAddress: string, eg "So11111111111111111111111111111111111111112" (required) + amount: number, eg 1, 0.01 (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const mintAddress = parsedInput.mintAddress + const amount = parsedInput.amount; + + const tx = await this.solanaKit.luloWithdraw(mintAddress, amount); + + return JSON.stringify({ + status: "success", + message: "Asset withdraw successfully", + transaction: tx, + amount, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } + } \ No newline at end of file diff --git a/src/tools/lulo/index.ts b/src/tools/lulo/index.ts index a28ed36..2a9ad20 100644 --- a/src/tools/lulo/index.ts +++ b/src/tools/lulo/index.ts @@ -1 +1,3 @@ export * from "./lend"; +export * from "./lulo_lend"; +export * from "./lulo_withdraw"; diff --git a/src/tools/lulo/lulo_lend.ts b/src/tools/lulo/lulo_lend.ts new file mode 100644 index 0000000..ab4610c --- /dev/null +++ b/src/tools/lulo/lulo_lend.ts @@ -0,0 +1,64 @@ +import { VersionedTransaction } from "@solana/web3.js"; +import { SolanaAgentKit } from "../../index"; + +/** + * Lend tokens for yields using Lulo + * @param agent SolanaAgentKit instance + * @param mintAddress SPL Mint address + * @param amount Amount to lend + * @returns Transaction signature + */ +export async function luloLend( + agent: SolanaAgentKit, + mintAddress: string, + amount: number, +): Promise { + try { + const response = await fetch( + `https://api.flexlend.fi/generate/account/deposit?priorityFee=50000`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-wallet-pubkey": agent.wallet.publicKey.toBase58(), + "x-api-key": process.env.FLEXLEND_API_KEY! + }, + body: JSON.stringify({ + owner: agent.wallet.publicKey.toBase58(), + mintAddress: mintAddress, + depositAmount: amount.toString(), + }), + }, + ); + const { data: { transactionMeta } } = await response.json() + + // Deserialize the transaction + const luloTxn = VersionedTransaction.deserialize( + Buffer.from(transactionMeta[0].transaction, "base64"), + ); + + // Get a recent blockhash and set it + const { blockhash } = await agent.connection.getLatestBlockhash(); + luloTxn.message.recentBlockhash = blockhash; + + // Sign and send transaction + luloTxn.sign([agent.wallet]); + + const signature = await agent.connection.sendTransaction(luloTxn, { + preflightCommitment: "confirmed", + maxRetries: 3, + }); + + // Wait for confirmation using the latest strategy + const latestBlockhash = await agent.connection.getLatestBlockhash(); + await agent.connection.confirmTransaction({ + signature, + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + }); + + return signature; + } catch (error: any) { + throw new Error(`Lending failed: ${error.message}`); + } +} diff --git a/src/tools/lulo/lulo_withdraw.ts b/src/tools/lulo/lulo_withdraw.ts new file mode 100644 index 0000000..cfc88b2 --- /dev/null +++ b/src/tools/lulo/lulo_withdraw.ts @@ -0,0 +1,69 @@ +import { VersionedTransaction } from "@solana/web3.js"; +import { SolanaAgentKit } from "../../index"; + +/** + * Withdraw tokens for yields using Lulo + * @param agent SolanaAgentKit instance + * @param mintAddress SPL Mint address + * @param amount Amount to withdraw + * @returns Transaction signature + */ +export async function luloWithdraw( + agent: SolanaAgentKit, + mintAddress: string, + amount: number, +): Promise { + try { + if (!agent.config.FLEXLEND_API_KEY) { + throw new Error("Lulo API key not found in agent configuration"); + } + + const response = await fetch( + `https://api.flexlend.fi/generate/account/withdraw?priorityFee=50000`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-wallet-pubkey": agent.wallet.publicKey.toBase58(), + "x-api-key": agent.config.FLEXLEND_API_KEY + }, + body: JSON.stringify({ + owner: agent.wallet.publicKey.toBase58(), + mintAddress: mintAddress, + depositAmount: amount, + }), + }, + ); + + const { data: { transactionMeta } } = await response.json() + + // Deserialize the transaction + const luloTxn = VersionedTransaction.deserialize( + Buffer.from(transactionMeta[0].transaction, "base64"), + ); + + // Get a recent blockhash and set it + const { blockhash } = await agent.connection.getLatestBlockhash(); + luloTxn.message.recentBlockhash = blockhash; + + // Sign and send transaction + luloTxn.sign([agent.wallet]); + + const signature = await agent.connection.sendTransaction(luloTxn, { + preflightCommitment: "confirmed", + maxRetries: 3, + }); + + // Wait for confirmation using the latest strategy + const latestBlockhash = await agent.connection.getLatestBlockhash(); + await agent.connection.confirmTransaction({ + signature, + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + }); + + return signature; + } catch (error: any) { + throw new Error(`Lending failed: ${error.message}`); + } +} diff --git a/src/types/index.ts b/src/types/index.ts index 01ac152..1fbec8f 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -7,6 +7,7 @@ export interface Config { JUPITER_REFERRAL_ACCOUNT?: string; JUPITER_FEE_BPS?: number; FLASH_PRIVILEGE?: string; + FLEXLEND_API_KEY?: string; } export interface Creator { From 60adc8d8c536f0fc6bf2bf61e871cbb82f5d9ae1 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Mon, 13 Jan 2025 21:17:53 +0100 Subject: [PATCH 14/32] feat + fix: add action to get user drift account info and fix deposit, borrow, lend and withdraw on drift --- .../drift/depositToDriftUserAccount.ts | 25 +--- src/actions/drift/driftUserAccountInfo.ts | 39 ++++++ src/actions/drift/tradePerpAccount.ts | 5 +- src/actions/drift/withdrawFromDriftAccount.ts | 14 +- src/actions/index.ts | 4 +- src/tools/drift.ts | 130 ++++++++++++++++-- src/tools/drift_vault.ts | 2 +- 7 files changed, 183 insertions(+), 36 deletions(-) create mode 100644 src/actions/drift/driftUserAccountInfo.ts diff --git a/src/actions/drift/depositToDriftUserAccount.ts b/src/actions/drift/depositToDriftUserAccount.ts index d58aa7c..af152c3 100644 --- a/src/actions/drift/depositToDriftUserAccount.ts +++ b/src/actions/drift/depositToDriftUserAccount.ts @@ -10,6 +10,7 @@ const depositToDriftUserAccountAction: Action = { "deposit into drift user account", "add funds to drift user account", "add funds to my drift account", + "deposit collateral into drift account", ], examples: [ [ @@ -27,22 +28,6 @@ const depositToDriftUserAccountAction: Action = { explanation: "Deposit 100 USDC into your drift user account", }, ], - [ - { - input: { - amount: 100, - symbol: "USDC", - address: "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBD", - }, - output: { - status: "success", - message: "Funds deposited successfully", - signature: - "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", - }, - explanation: "Deposit 100 USDC into a drift user account", - }, - ], ], schema: z.object({ amount: z @@ -55,7 +40,11 @@ const depositToDriftUserAccountAction: Action = { .string() .toUpperCase() .describe("The symbol of the token you'd like to deposit"), - address: z.string().optional().describe("The drift user account address"), + repay: z + .boolean() + .optional() + .default(false) + .describe("Whether or not to repay the borrowed funds in the account"), }), handler: async (agent: SolanaAgentKit, input) => { try { @@ -63,7 +52,7 @@ const depositToDriftUserAccountAction: Action = { agent, input.amount as number, input.symbol as string, - input.address, + input.repay as boolean, ); return { diff --git a/src/actions/drift/driftUserAccountInfo.ts b/src/actions/drift/driftUserAccountInfo.ts new file mode 100644 index 0000000..0b86705 --- /dev/null +++ b/src/actions/drift/driftUserAccountInfo.ts @@ -0,0 +1,39 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { driftUserAccountInfo } from "../../tools"; + +const driftUserAccountInfoAction: Action = { + name: "DRIFT_USER_ACCOUNT_INFO", + similes: ["get drift user account info", "get drift account info"], + description: "Get information about your drift account", + examples: [ + [ + { + input: {}, + explanation: "Get information about your drift account", + output: { + status: "success", + data: {}, + }, + }, + ], + ], + schema: z.object({}), + handler: async (agent) => { + try { + const accountInfo = await driftUserAccountInfo(agent); + return { + status: "success", + data: accountInfo, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message is a string + message: `Failed to get drift account info: ${e.message}`, + }; + } + }, +}; + +export default driftUserAccountInfoAction; diff --git a/src/actions/drift/tradePerpAccount.ts b/src/actions/drift/tradePerpAccount.ts index 5868020..ae1db7e 100644 --- a/src/actions/drift/tradePerpAccount.ts +++ b/src/actions/drift/tradePerpAccount.ts @@ -47,7 +47,10 @@ export const tradeDriftPerpAccountAction: Action = { ], schema: z.object({ amount: z.number().positive(), - symbol: z.string().min(3).max(10), + symbol: z + .string() + .toUpperCase() + .describe("Symbol of the token to open a position on "), action: z.enum(["long", "short"]), type: z.enum(["market", "limit"]), price: z.number().positive().optional(), diff --git a/src/actions/drift/withdrawFromDriftAccount.ts b/src/actions/drift/withdrawFromDriftAccount.ts index 552329c..00d72b6 100644 --- a/src/actions/drift/withdrawFromDriftAccount.ts +++ b/src/actions/drift/withdrawFromDriftAccount.ts @@ -3,12 +3,16 @@ import type { Action } from "../../types"; import { withdrawFromDriftUserAccount } from "../../tools"; const withdrawFromDriftAccountAction: Action = { - name: "WITHDRAW_FROM_DRIFT_ACCOUNT", + name: "WITHDRAW_OR_BORROW_FROM_DRIFT_ACCOUNT", description: "Withdraw funds from your drift account", similes: [ "withdraw from drift account", "withdraw funds from drift account", "withdraw funds from my drift account", + "borrow from drift account", + "borrow funds from my drift account", + "borrow from drift", + "withdraw from drift", ], examples: [ [ @@ -38,6 +42,13 @@ const withdrawFromDriftAccountAction: Action = { .string() .toUpperCase() .describe("The symbol of the token you'd like to withdraw"), + isBorrow: z + .boolean() + .optional() + .default(false) + .describe( + "Whether or not to borrow funds based on collateral provided instead of withdrawing", + ), }), handler: async (agent, input) => { try { @@ -45,6 +56,7 @@ const withdrawFromDriftAccountAction: Action = { agent, input.amount, input.symbol, + input.isBorrow, ); return { diff --git a/src/actions/index.ts b/src/actions/index.ts index 6c675d1..5e5b02e 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -42,6 +42,7 @@ import tradeDriftPerpAccountAction from "./drift/tradePerpAccount"; import doesUserHaveDriftAccountAction from "./drift/doesUserHaveDriftAccount"; import depositToDriftUserAccountAction from "./drift/depositToDriftUserAccount"; import withdrawFromDriftAccountAction from "./drift/withdrawFromDriftAccount"; +import driftUserAccountInfoAction from "./drift/driftUserAccountInfo"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -88,7 +89,8 @@ export const ACTIONS = { TRADE_DRIFT_PERP_ACCOUNT_ACTION: tradeDriftPerpAccountAction, DOES_USER_HAVE_DRIFT_ACCOUNT_ACTION: doesUserHaveDriftAccountAction, DEPOSIT_TO_DRIFT_USER_ACCOUNT_ACTION: depositToDriftUserAccountAction, - WITHDRAW_FROM_DRIFT_ACCOUNT_ACTION: withdrawFromDriftAccountAction, + WITHDRAW_OR_BORROW_FROM_DRIFT_ACCOUNT_ACTION: withdrawFromDriftAccountAction, + DRIFT_USER_ACCOUNT_INFO_ACTION: driftUserAccountInfoAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/tools/drift.ts b/src/tools/drift.ts index a7240aa..e150fd8 100644 --- a/src/tools/drift.ts +++ b/src/tools/drift.ts @@ -12,15 +12,17 @@ import { PositionDirection, PostOnlyParams, PRICE_PRECISION, + QUOTE_PRECISION, User, type IWallet, } from "@drift-labs/sdk"; import type { SolanaAgentKit } from "../agent"; import * as anchor from "@coral-xyz/anchor"; import { IDL, VAULT_PROGRAM_ID, VaultClient } from "@drift-labs/vaults-sdk"; -import { BN } from "bn.js"; import { getAssociatedTokenAddressSync } from "@solana/spl-token"; import { PublicKey } from "@solana/web3.js"; +import { Transaction } from "@solana/web3.js"; +import { ComputeBudgetProgram } from "@solana/web3.js"; export async function initClients(agent: SolanaAgentKit) { const wallet: IWallet = { @@ -103,7 +105,7 @@ export async function createDriftUserAccount( } if (!userAccountExists) { - const depositAmount = new BN(amount).mul(token.precision); + const depositAmount = numberToSafeBN(amount, token.precision); const [txSignature, account] = await driftClient.initializeUserAccountAndDepositCollateral( depositAmount, @@ -130,18 +132,18 @@ export async function createDriftUserAccount( * @param agent * @param amount * @param symbol - * @param address + * @param isRepay * @returns */ export async function depositToDriftUserAccount( agent: SolanaAgentKit, amount: number, symbol: string, - address?: string, + isRepay = false, ) { try { const { driftClient, cleanUp } = await initClients(agent); - const publicKey = address ? new PublicKey(address) : agent.wallet.publicKey; + const publicKey = agent.wallet.publicKey; const user = new User({ driftClient, userAccountPublicKey: getUserAccountPublicKeySync( @@ -162,11 +164,29 @@ export async function depositToDriftUserAccount( throw new Error("You need to create a Drift user account first."); } - const depositAmount = new BN(amount).mul(token.precision); - const txSignature = await driftClient.deposit( - depositAmount, - token.marketIndex, - getAssociatedTokenAddressSync(token.mint, publicKey), + const depositAmount = numberToSafeBN(amount, token.precision); + + const [depInstruction, latestBlockhash] = await Promise.all([ + driftClient.getDepositTxnIx( + depositAmount, + token.marketIndex, + getAssociatedTokenAddressSync(token.mint, publicKey), + undefined, + isRepay, + ), + driftClient.connection.getLatestBlockhash(), + ]); + + const tx = new Transaction().add(...depInstruction).add( + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: 0.000001 * 1000000 * 1000000, + }), + ); + tx.recentBlockhash = latestBlockhash.blockhash; + tx.sign(agent.wallet); + const txSignature = await driftClient.txSender.sendRawTransaction( + tx.serialize(), + { ...driftClient.opts }, ); await cleanUp(); @@ -181,6 +201,7 @@ export async function withdrawFromDriftUserAccount( agent: SolanaAgentKit, amount: number, symbol: string, + isBorrow = false, ) { try { const { driftClient, cleanUp } = await initClients(agent); @@ -207,10 +228,27 @@ export async function withdrawFromDriftUserAccount( const withdrawAmount = numberToSafeBN(amount, token.precision); - const txSignature = await driftClient.withdraw( - withdrawAmount, - token.marketIndex, - getAssociatedTokenAddressSync(token.mint, agent.wallet.publicKey), + const [withdrawInstruction, latestBlockhash] = await Promise.all([ + driftClient.getWithdrawalIxs( + withdrawAmount, + token.marketIndex, + getAssociatedTokenAddressSync(token.mint, agent.wallet.publicKey), + !isBorrow, + ), + driftClient.connection.getLatestBlockhash(), + ]); + + const tx = new Transaction().add(...withdrawInstruction).add( + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: 0.000001 * 1000000 * 1000000, + }), + ); + tx.recentBlockhash = latestBlockhash.blockhash; + tx.sign(agent.wallet); + + const txSignature = await driftClient.txSender.sendRawTransaction( + tx.serialize(), + { ...driftClient.opts }, ); await cleanUp(); @@ -289,6 +327,9 @@ export async function driftPerpTrade( price: numberToSafeBN(params.price, PRICE_PRECISION), postOnly: PostOnlyParams.SLIDE, }), + { + computeUnitsPrice: 0.000001 * 1000000 * 1000000, + }, ); } else { signature = await driftClient.placePerpOrder( @@ -301,6 +342,9 @@ export async function driftPerpTrade( : PositionDirection.SHORT, marketIndex: market.marketIndex, }), + { + computeUnitsPrice: 0.000001 * 1000000 * 1000000, + }, ); } @@ -342,3 +386,61 @@ export async function doesUserHaveDriftAccount(agent: SolanaAgentKit) { throw new Error(`Failed to check user account: ${e.message}`); } } + +/** + * Get account info for a drift User + * @param agent + * @returns + */ +export async function driftUserAccountInfo(agent: SolanaAgentKit) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const user = new User({ + driftClient, + userAccountPublicKey: getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + agent.wallet.publicKey, + ), + }); + const userAccountExists = await user.exists(); + + if (!userAccountExists) { + throw new Error("User account does not exist"); + } + await user.subscribe(); + const account = user.getUserAccount(); + await user.unsubscribe(); + + await cleanUp(); + const perpPositions = account.perpPositions.map((pos) => ({ + ...pos, + baseAssetAmount: convertToNumber(pos.baseAssetAmount, BASE_PRECISION), + settledPnl: convertToNumber(pos.settledPnl, QUOTE_PRECISION), + })); + const spotPositions = account.spotPositions.map((pos) => ({ + ...pos, + scaledBalance: convertToNumber(pos.scaledBalance, BASE_PRECISION), + cumulativeDeposits: convertToNumber( + pos.cumulativeDeposits, + BASE_PRECISION, + ), + symbol: MainnetSpotMarkets.find((v) => v.marketIndex === pos.marketIndex) + ?.symbol, + })); + + return { + ...account, + name: account.name, + authority: account.authority, + totalDeposits: `$${convertToNumber(account.totalDeposits, QUOTE_PRECISION)}`, + totalWithdraws: `$${convertToNumber(account.totalWithdraws, QUOTE_PRECISION)}`, + settledPerpPnl: `$${convertToNumber(account.settledPerpPnl, QUOTE_PRECISION)}`, + lastActiveSlot: account.lastActiveSlot.toNumber(), + perpPositions, + spotPositions, + }; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to check user account: ${e.message}`); + } +} diff --git a/src/tools/drift_vault.ts b/src/tools/drift_vault.ts index 200c6ef..e58f7a2 100644 --- a/src/tools/drift_vault.ts +++ b/src/tools/drift_vault.ts @@ -134,7 +134,7 @@ export async function createVault( .toNumber(), minDepositAmount: numberToSafeBN(params.minDepositAmount, spotPrecision), redeemPeriod: new BN(params.redeemPeriod * 86400), - maxTokens: new BN(params.maxTokens).mul(spotPrecision), + maxTokens: numberToSafeBN(params.maxTokens, spotPrecision), managementFee: new BN(params.managementFee) .mul(PERCENTAGE_PRECISION) .div(new BN(100)), From 82847f5723a5d784deeccf4bb43a4d81c36f7790 Mon Sep 17 00:00:00 2001 From: Arihant Bansal <17180950+arihantbansal@users.noreply.github.com> Date: Tue, 14 Jan 2025 16:20:56 +0530 Subject: [PATCH 15/32] feat: update contributing docs --- guides/add_your_own_tool.md | 63 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/guides/add_your_own_tool.md b/guides/add_your_own_tool.md index b5c0a97..c96fef7 100644 --- a/guides/add_your_own_tool.md +++ b/guides/add_your_own_tool.md @@ -9,23 +9,23 @@ Extending the **Solana Agent Kit** with custom tools allows you to add specializ 3. Add supporting functions in SolanaAgentKit 4. Implement the Langchain tool class 5. Export the Langchain tool -6. Define Action class for given tool -7. Export Action -8. Use the custom tool +6. Export your protocol's langchain tools (if not already exported) +7. Define Action class for given tool +8. Export Action +9. 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`). +Create a new TypeScript file in the `src/tools/your_protocol` directory for your tool (e.g., `custom_tool.ts`). If the `src/tools/your_protocol` directory does not exist, create it. - -### 2. Export the Tool +### 2. Export the Tool (if not already exported) > `src/tools/index.ts` ```typescript:src/tools/index.ts -export * from "./request_faucet_funds"; -export * from "./deploy_token"; -export * from "./custom_tool"; // Add your new tool +export * from "./squads"; +export * from "./jupiter"; +export * from "./your_protocol"; // Add your protocol here if it's not already in the list ``` ### 3. Add Supporting Functions to SolanaAgentKit @@ -42,10 +42,10 @@ export class SolanaAgentKit { ``` ### 4. Implement the Langchain Tool Class -> `src/langchain/index.ts` -```typescript:src/langchain/index.ts +> `src/langchain/your_protocol/custom_tool.ts` +```typescript:src/langchain/your_protocol/custom_tool.ts import { Tool } from "langchain/tools"; -import { SolanaAgentKit } from "../agent"; +import { SolanaAgentKit } from "../../agent"; export class CustomTool extends Tool { name = "custom_tool"; @@ -75,26 +75,26 @@ export class CustomTool extends Tool { ``` ### 5. Export Langchain Tool -> `src/langchain/index.ts` -```typescript:src/langchain/index.ts -import { CustomTool } from "../tools"; - -export function createSolanaTools(agent: SolanaAgentKit) { - return [ - // ... existing tools ... - new CustomTool(agent), - ]; -} +> `src/langchain/your_protocol/index.ts` +```typescript:src/langchain/your_protocol/index.ts +export * from "./custom_tool"; ``` -### 6. Define Action class for given tool +### 6. Export your protocol's langchain tools (if not already exported) +> `src/langchain/index.ts` +```typescript:src/langchain/index.ts +export * from "./tiplink"; +export * from "./your_protocol"; // Add your protocol here if it's not already in the list +``` -> `src/actions/custom_action.ts` -```typescript:src/actions/custom_action.ts -import { Action } from "../types/action"; -import { SolanaAgentKit } from "../agent"; +### 7. Define Action class for given tool + +> `src/actions/your_protocol/custom_action.ts` +```typescript:src/actions/your_protocol/custom_action.ts +import { Action } from "../../types/action"; +import { SolanaAgentKit } from "../../agent"; import { z } from "zod"; -import { custom_tool } from "../tools"; +import { custom_tool } from "../../tools"; const customAction: Action = { name: "CUSTOM_ACTION", @@ -121,11 +121,10 @@ const customAction: Action = { }; ``` -### 7. Export Action +### 8. Export Action > `src/actions/index.ts` ```typescript:src/actions/index.ts -export * from "./balance"; -export * from "./custom_action"; +import customAction from "./your_protocol/custom_action"; export const ACTIONS = { // ... existing actions ... @@ -133,7 +132,7 @@ export const ACTIONS = { } ``` -### 8. Usage Example +### 9. Usage Example Add a code example in the `README.md` file. From f0d84f692481b320fca2b2d8c91e7fe7fbd6b969 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Tue, 14 Jan 2025 12:43:28 +0100 Subject: [PATCH 16/32] feat: add drift functions to agent class --- src/actions/drift/createVault.ts | 4 +- src/actions/drift/deriveVaultAddress.ts | 46 ++++++++ src/actions/drift/tradeDelegatedDriftVault.ts | 4 +- src/actions/drift/vaultInfo.ts | 27 +---- src/actions/index.ts | 2 + src/agent/index.ts | 109 ++++++++++++++++++ src/tools/drift/drift.ts | 2 +- src/tools/drift/drift_vault.ts | 65 +++++++++-- 8 files changed, 223 insertions(+), 36 deletions(-) create mode 100644 src/actions/drift/deriveVaultAddress.ts diff --git a/src/actions/drift/createVault.ts b/src/actions/drift/createVault.ts index 1d73fc9..26ac59b 100644 --- a/src/actions/drift/createVault.ts +++ b/src/actions/drift/createVault.ts @@ -90,7 +90,9 @@ const createDriftVaultAction: Action = { return { status: "success", - message: "Drift vault created successfully", + message: + "Drift vault created successfully. Please note down the name of your vault as it is unique and was used to derive your vault address", + vaultName: input.name, signature: tx, }; } catch (e) { diff --git a/src/actions/drift/deriveVaultAddress.ts b/src/actions/drift/deriveVaultAddress.ts new file mode 100644 index 0000000..63ce7ee --- /dev/null +++ b/src/actions/drift/deriveVaultAddress.ts @@ -0,0 +1,46 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { getVaultAddress } from "../../tools"; + +const deriveDriftVaultAddressAction: Action = { + name: "DERIVE_DRIFT_VAULT_ADDRESS_ACTION", + similes: ["derive drift vault address", "get drift vault address"], + description: "Derive a drift vault address from the vaults name", + examples: [ + [ + { + input: { + name: "My Drift Vault", + }, + output: { + status: "success", + message: "Vault address derived successfully", + address: "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBD", + }, + explanation: "Derive a drift vault address", + }, + ], + ], + schema: z.object({ + name: z.string().describe("The name of the vault to derive the address of"), + }), + handler: async (agent, input) => { + try { + const address = await getVaultAddress(agent, input.name as string); + + return { + status: "success", + message: "Vault address derived successfully", + address, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to derive vault address: ${e.message}`, + }; + } + }, +}; + +export default deriveDriftVaultAddressAction; diff --git a/src/actions/drift/tradeDelegatedDriftVault.ts b/src/actions/drift/tradeDelegatedDriftVault.ts index a51e143..c85d8b3 100644 --- a/src/actions/drift/tradeDelegatedDriftVault.ts +++ b/src/actions/drift/tradeDelegatedDriftVault.ts @@ -66,7 +66,7 @@ const tradeDelegatedDriftVaultAction: Action = { vaultAddress: z.string().describe("Address of the Drift vault to trade in"), amount: z.number().positive().describe("Amount to trade"), symbol: z.string().describe("Symbol of the token to trade"), - action: z.enum(["buy", "sell"]).describe("Trade action - buy or sell"), + action: z.enum(["long", "short"]).describe("Trade action - long or short"), type: z.enum(["market", "limit"]).describe("Trade type - market or limit"), price: z.number().positive().optional().describe("Price for limit order"), }), @@ -76,7 +76,7 @@ const tradeDelegatedDriftVaultAction: Action = { vaultAddress: input.vaultAddress as string, amount: input.amount as number, symbol: input.symbol as string, - action: input.action as "buy" | "sell", + action: input.action as "long" | "short", type: input.type as "market" | "limit", price: input.price as number | undefined, }; diff --git a/src/actions/drift/vaultInfo.ts b/src/actions/drift/vaultInfo.ts index c354ae5..279f78b 100644 --- a/src/actions/drift/vaultInfo.ts +++ b/src/actions/drift/vaultInfo.ts @@ -13,7 +13,7 @@ const vaultInfoAction: Action = { [ { input: { - vaultAddress: "2nFeP7taii", + vaultName: "test-vault", }, output: { status: "success", @@ -35,35 +35,16 @@ const vaultInfoAction: Action = { ], ], schema: z.object({ - vaultAddress: z.string(), + vaultName: z.string(), }), handler: async (agent: SolanaAgentKit, input) => { try { - const vaultInfo = await getVaultInfo(agent, input.vaultAddress as string); - const spotToken = MainnetSpotMarkets[vaultInfo.spotMarketIndex]; - const data = { - name: decodeName(vaultInfo.name), - marketName: `${spotToken.symbol}-SPOT`, - redeemPeriod: vaultInfo.redeemPeriod.toNumber(), - maxTokens: vaultInfo.maxTokens.div(spotToken.precision).toNumber(), - minDepositAmount: vaultInfo.minDepositAmount - .div(spotToken.precision) - .toNumber(), - managementFee: - (vaultInfo.managementFee.toNumber() / - PERCENTAGE_PRECISION.toNumber()) * - 100, - profitShare: - (vaultInfo.profitShare / PERCENTAGE_PRECISION.toNumber()) * 100, - hurdleRate: - (vaultInfo.hurdleRate / PERCENTAGE_PRECISION.toNumber()) * 100, - permissioned: vaultInfo.permissioned, - }; + const vaultInfo = await getVaultInfo(agent, input.vaultName as string); return { status: "success", message: "Vault info retrieved successfully", - data, + data: vaultInfo, }; } catch (e) { return { diff --git a/src/actions/index.ts b/src/actions/index.ts index 3cbc7df..4664ded 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -56,6 +56,7 @@ import doesUserHaveDriftAccountAction from "./drift/doesUserHaveDriftAccount"; import depositToDriftUserAccountAction from "./drift/depositToDriftUserAccount"; import withdrawFromDriftAccountAction from "./drift/withdrawFromDriftAccount"; import driftUserAccountInfoAction from "./drift/driftUserAccountInfo"; +import deriveDriftVaultAddressAction from "./drift/deriveVaultAddress"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -117,6 +118,7 @@ export const ACTIONS = { DEPOSIT_TO_DRIFT_USER_ACCOUNT_ACTION: depositToDriftUserAccountAction, WITHDRAW_OR_BORROW_FROM_DRIFT_ACCOUNT_ACTION: withdrawFromDriftAccountAction, DRIFT_USER_ACCOUNT_INFO_ACTION: driftUserAccountInfoAction, + DERIVE_DRIFT_VAULT_ADDRESS_ACTION: deriveDriftVaultAddressAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/agent/index.ts b/src/agent/index.ts index ff6352c..d889897 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -82,6 +82,20 @@ import { getHeliusWebhook, create_HeliusWebhook, deleteHeliusWebhook, + createDriftUserAccount, + createVault, + depositIntoVault, + depositToDriftUserAccount, + getVaultAddress, + doesUserHaveDriftAccount, + driftUserAccountInfo, + requestWithdrawalFromVault, + tradeDriftVault, + driftPerpTrade, + updateVault, + getVaultInfo, + withdrawFromDriftUserAccount, + withdrawFromDriftVault, } from "../tools"; import { Config, @@ -694,4 +708,99 @@ export class SolanaAgentKit { async deleteWebhook(webhookID: string): Promise { return deleteHeliusWebhook(this, webhookID); } + + async createDriftUserAccount(depositAmount: number, depositSymbol: string) { + return await createDriftUserAccount(this, depositAmount, depositSymbol); + } + async createDriftVault(params: { + name: string; + marketName: `${string}-${string}`; + redeemPeriod: number; + maxTokens: number; + minDepositAmount: number; + managementFee: number; + profitShare: number; + hurdleRate?: number; + permissioned?: boolean; + }) { + return await createVault(this, params); + } + async depositIntoDriftVault(amount: number, vault: string) { + return await depositIntoVault(this, amount, vault); + } + async depositToDriftUserAccount( + amount: number, + symbol: string, + isRepayment?: boolean, + ) { + return await depositToDriftUserAccount(this, amount, symbol, isRepayment); + } + async deriveDriftVaultAddress(name: string) { + return await getVaultAddress(this, name); + } + async doesUserHaveDriftAccount() { + return await doesUserHaveDriftAccount(this); + } + async driftUserAccountInfo() { + return await driftUserAccountInfo(this); + } + async requestWithdrawalFromDriftVault(amount: number, vault: string) { + return await requestWithdrawalFromVault(this, amount, vault); + } + async tradeUsingDelegatedDriftVault( + vault: string, + amount: number, + symbol: string, + action: "long" | "short", + type: "market" | "limit", + price?: number, + ) { + return await tradeDriftVault( + this, + vault, + amount, + symbol, + action, + type, + price, + ); + } + async tradeUsingDriftPerpAccount( + amount: number, + symbol: string, + action: "long" | "short", + type: "market" | "limit", + price?: number, + ) { + return await driftPerpTrade(this, { action, amount, symbol, type, price }); + } + async updateDriftVault( + vaultAddress: string, + params: { + name: string; + marketName: `${string}-${string}`; + redeemPeriod: number; + maxTokens: number; + minDepositAmount: number; + managementFee: number; + profitShare: number; + hurdleRate?: number; + permissioned?: boolean; + }, + ) { + return await updateVault(this, vaultAddress, params); + } + async getDriftVaultInfo(vaultName: string) { + return await getVaultInfo(this, vaultName); + } + async withdrawFromDriftAccount( + amount: number, + symbol: string, + isBorrow?: boolean, + ) { + return await withdrawFromDriftUserAccount(this, amount, symbol, isBorrow); + } + async withdrawFromDriftVault(vault: string) { + return await withdrawFromDriftVault(this, vault); + } } diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 525a379..d112fca 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -276,7 +276,7 @@ export async function driftPerpTrade( symbol: string; action: "long" | "short"; type: "market" | "limit"; - price?: number; + price?: number | undefined; }, ) { try { diff --git a/src/tools/drift/drift_vault.ts b/src/tools/drift/drift_vault.ts index 85e803d..3bfa182 100644 --- a/src/tools/drift/drift_vault.ts +++ b/src/tools/drift/drift_vault.ts @@ -18,6 +18,7 @@ import { import { WithdrawUnit, encodeName, + getVaultAddressSync, getVaultDepositorAddressSync, } from "@drift-labs/vaults-sdk"; import { @@ -233,18 +234,39 @@ export async function updateVault( } } -export async function getVaultInfo( - agent: SolanaAgentKit, - vaultAddress: string, -) { +export async function getVaultInfo(agent: SolanaAgentKit, vaultName: string) { try { const { vaultClient, cleanUp } = await initClients(agent); - const vaultPublicKey = new PublicKey(vaultAddress); + const vaultPublicKey = getVaultAddressSync( + vaultClient.program.programId, + encodeName(vaultName), + ); const vaultDetails = await vaultClient.getVault(vaultPublicKey); await cleanUp(); - return vaultDetails; + const spotToken = MainnetSpotMarkets[vaultDetails.spotMarketIndex]; + const data = { + name: vaultName, + address: vaultPublicKey.toBase58(), + marketName: `${spotToken.symbol}-SPOT`, + redeemPeriod: vaultDetails.redeemPeriod.toNumber(), + maxTokens: vaultDetails.maxTokens.div(spotToken.precision).toNumber(), + minDepositAmount: vaultDetails.minDepositAmount + .div(spotToken.precision) + .toNumber(), + managementFee: + (vaultDetails.managementFee.toNumber() / + PERCENTAGE_PRECISION.toNumber()) * + 100, + profitShare: + (vaultDetails.profitShare / PERCENTAGE_PRECISION.toNumber()) * 100, + hurdleRate: + (vaultDetails.hurdleRate / PERCENTAGE_PRECISION.toNumber()) * 100, + permissioned: vaultDetails.permissioned, + }; + + return data; } catch (e) { // @ts-expect-error - error message is a string throw new Error(`Failed to get vault info: ${e.message}`); @@ -395,6 +417,31 @@ async function getIsOwned(agent: SolanaAgentKit, vault: string) { } } +/** + * Get a vaults address using the vault's name + * @param agent + * @param name + */ +export async function getVaultAddress(agent: SolanaAgentKit, name: string) { + const encodedName = encodeName(name); + + try { + const { vaultClient, cleanUp } = await initClients(agent); + const vaultAddress = getVaultAddressSync( + vaultClient.program.programId, + encodedName, + ); + + await cleanUp(); + return vaultAddress; + } catch (e) { + throw new Error( + // @ts-expect-error - error message is a string + `Failed to get vault address: ${e.message}`, + ); + } +} + /** Carry out a trade with a delegated vault @param agent SolanaAgentKit instance @@ -409,7 +456,7 @@ export async function tradeDriftVault( vault: string, amount: number, symbol: string, - action: "buy" | "sell", + action: "long" | "short", type: "market" | "limit", price?: number, ) { @@ -494,7 +541,7 @@ export async function tradeDriftVault( marketType: MarketType.PERP, baseAssetAmount: numberToSafeBN(baseAmount, BASE_PRECISION), direction: - action === "buy" + action === "long" ? PositionDirection.LONG : PositionDirection.SHORT, marketIndex: perpMarketAccount.marketIndex, @@ -512,7 +559,7 @@ export async function tradeDriftVault( marketType: MarketType.PERP, baseAssetAmount: numberToSafeBN(baseAmount, BASE_PRECISION), direction: - action === "buy" + action === "long" ? PositionDirection.LONG : PositionDirection.SHORT, marketIndex: perpMarketAccount.marketIndex, From 4d50d2f2603ee4b6af1f483a0895c4490638a306 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Tue, 14 Jan 2025 15:08:18 +0100 Subject: [PATCH 17/32] fix: drift vault experience --- src/actions/drift/updateDriftVaultDelegate.ts | 53 ++++++++ src/actions/drift/updateVault.ts | 25 +++- src/actions/index.ts | 2 + src/agent/index.ts | 4 + src/tools/drift/drift.ts | 16 ++- src/tools/drift/drift_vault.ts | 121 ++++++++++++------ 6 files changed, 172 insertions(+), 49 deletions(-) create mode 100644 src/actions/drift/updateDriftVaultDelegate.ts diff --git a/src/actions/drift/updateDriftVaultDelegate.ts b/src/actions/drift/updateDriftVaultDelegate.ts new file mode 100644 index 0000000..defc7a6 --- /dev/null +++ b/src/actions/drift/updateDriftVaultDelegate.ts @@ -0,0 +1,53 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { updateVaultDelegate } from "../../tools"; + +const updateDriftVaultDelegateAction: Action = { + name: "UPDATE_DRIFT_VAULT_DELEGATE_ACTION", + similes: ["update drift vault delegate", "change drift vault delegate"], + description: "Update the delegate of a drift vault", + examples: [ + [ + { + input: { + vaultAddress: "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBD", + newDelegate: "2nFeP7tai", + }, + output: { + status: "success", + message: "Vault delegate updated successfully", + signature: + "2nFeP7taii3wGVgrWk4YiLMPmhtu3Zg9iXCUu4zGBDadwunHw8reXFxRWT7khbFsQ9JT3zK4RYDLNDFDRYvM3wJk", + }, + explanation: "Update the delegate of a drift vault to another address", + }, + ], + ], + schema: z.object({ + vaultAddress: z.string(), + newDelegate: z.string(), + }), + handler: async (agent, input) => { + try { + const tx = await updateVaultDelegate( + agent, + input.vaultAddress as string, + input.newDelegate as string, + ); + + return { + status: "success", + message: "Vault delegate updated successfully", + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error - error message + message: `Failed to update vault delegate: ${e.message}`, + }; + } + }, +}; + +export default updateDriftVaultDelegateAction; diff --git a/src/actions/drift/updateVault.ts b/src/actions/drift/updateVault.ts index 530e1ce..4d0f66e 100644 --- a/src/actions/drift/updateVault.ts +++ b/src/actions/drift/updateVault.ts @@ -32,14 +32,25 @@ const updateDriftVaultAction: Action = { ], schema: z.object({ vaultAddress: z.string(), - name: z.string().min(5, "Name must be at least 5 characters"), + name: z.string().min(5, "Name must be at least 5 characters").optional(), // regex matches SOL-SPOT - marketName: z.string().regex(/^([A-Za-z0-9]{2,7})-SPOT$/), - redeemPeriod: z.number().int().min(1, "Redeem period must be at least 1"), - maxTokens: z.number().int().min(100, "Max tokens must be at least 100"), - minDepositAmount: z.number().positive(), - managementFee: z.number().positive().max(20), - profitShare: z.number().positive().max(90).optional().default(5), + marketName: z + .string() + .regex(/^([A-Za-z0-9]{2,7})-SPOT$/) + .optional(), + redeemPeriod: z + .number() + .int() + .min(1, "Redeem period must be at least 1") + .optional(), + maxTokens: z + .number() + .int() + .min(100, "Max tokens must be at least 100") + .optional(), + minDepositAmount: z.number().positive().optional(), + managementFee: z.number().positive().max(20).optional(), + profitShare: z.number().positive().max(90).optional(), handleRate: z.number().optional(), permissioned: z .boolean() diff --git a/src/actions/index.ts b/src/actions/index.ts index 4664ded..63ec7c5 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -57,6 +57,7 @@ import depositToDriftUserAccountAction from "./drift/depositToDriftUserAccount"; import withdrawFromDriftAccountAction from "./drift/withdrawFromDriftAccount"; import driftUserAccountInfoAction from "./drift/driftUserAccountInfo"; import deriveDriftVaultAddressAction from "./drift/deriveVaultAddress"; +import updateDriftVaultDelegateAction from "./drift/updateDriftVaultDelegate"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -119,6 +120,7 @@ export const ACTIONS = { WITHDRAW_OR_BORROW_FROM_DRIFT_ACCOUNT_ACTION: withdrawFromDriftAccountAction, DRIFT_USER_ACCOUNT_INFO_ACTION: driftUserAccountInfoAction, DERIVE_DRIFT_VAULT_ADDRESS_ACTION: deriveDriftVaultAddressAction, + UPDATE_DRIFT_VAULT_DELEGATE_ACTION: updateDriftVaultDelegateAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/agent/index.ts b/src/agent/index.ts index d889897..45f085f 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -96,6 +96,7 @@ import { getVaultInfo, withdrawFromDriftUserAccount, withdrawFromDriftVault, + updateVaultDelegate, } from "../tools"; import { Config, @@ -803,4 +804,7 @@ export class SolanaAgentKit { async withdrawFromDriftVault(vault: string) { return await withdrawFromDriftVault(this, vault); } + async updateDriftVaultDelegate(vaultAddress: string, delegate: string) { + return await updateVaultDelegate(this, vaultAddress, delegate); + } } diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index d112fca..97105a4 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -24,7 +24,14 @@ import { PublicKey } from "@solana/web3.js"; import { Transaction } from "@solana/web3.js"; import { ComputeBudgetProgram } from "@solana/web3.js"; -export async function initClients(agent: SolanaAgentKit) { +export async function initClients( + agent: SolanaAgentKit, + params?: { + authority: PublicKey; + activeSubAccountId: number; + subAccountIds: number[]; + }, +) { const wallet: IWallet = { publicKey: agent.wallet.publicKey, payer: agent.wallet, @@ -40,10 +47,17 @@ export async function initClients(agent: SolanaAgentKit) { }, }; + // @ts-expect-error - false undefined type conflict const driftClient = new DriftClient({ connection: agent.connection, wallet, env: "mainnet-beta", + authority: params?.authority, + activeSubAccountId: params?.activeSubAccountId, + subAccountIds: params?.subAccountIds, + txParams: { + computeUnitsPrice: 0.000001 * 1000000 * 1000000, + }, txSender: new FastSingleTxSender({ connection: agent.connection, wallet, diff --git a/src/tools/drift/drift_vault.ts b/src/tools/drift/drift_vault.ts index 3bfa182..a65c485 100644 --- a/src/tools/drift/drift_vault.ts +++ b/src/tools/drift/drift_vault.ts @@ -14,8 +14,10 @@ import { PRICE_PRECISION, QUOTE_PRECISION, TEN, + User, } from "@drift-labs/sdk"; import { + VaultAccount, WithdrawUnit, encodeName, getVaultAddressSync, @@ -34,7 +36,7 @@ export function getMarketIndexAndType(name: `${string}-${string}`) { const [symbol, type] = name.toUpperCase().split("-"); if (type === "PERP") { - const token = MainnetPerpMarkets.find((v) => v.symbol === symbol); + const token = MainnetPerpMarkets.find((v) => v.baseAssetSymbol === symbol); if (!token) { throw new Error("Drift doesn't have that market"); } @@ -71,6 +73,31 @@ async function getOrCreateVaultDepositor(agent: SolanaAgentKit, vault: string) { } } +async function getVaultAvailableBalance(agent: SolanaAgentKit, vault: string) { + try { + const { cleanUp, vaultClient } = await initClients(agent); + const vaultDetails = await vaultClient.getVault(new PublicKey(vault)); + + const currentVaultBalance = convertToNumber( + vaultDetails.netDeposits, + QUOTE_PRECISION, + ); + const vaultWithdrawalsRequested = convertToNumber( + vaultDetails.totalWithdrawRequested, + QUOTE_PRECISION, + ); + const availableBalanceInUSD = + currentVaultBalance - vaultWithdrawalsRequested; + + await cleanUp(); + + return availableBalanceInUSD; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to get vault available balance: ${e.message}`); + } +} + /** Create a vault @param agent SolanaAgentKit instance @@ -151,6 +178,27 @@ export async function createVault( } } +export async function updateVaultDelegate( + agent: SolanaAgentKit, + vault: string, + delegateAddress: string, +) { + try { + const { vaultClient, cleanUp } = await initClients(agent); + const signature = await vaultClient.updateDelegate( + new PublicKey(vault), + new PublicKey(delegateAddress), + ); + await cleanUp(); + return signature; + } catch (e) { + throw new Error( + // @ts-expect-error - error message is a string + `Failed to update vault delegate: ${e.message}`, + ); + } +} + /** Update the vault's info @param agent SolanaAgentKit instance @@ -194,34 +242,32 @@ export async function updateVault( const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); const tx = await vaultClient.managerUpdateVault(vaultPublicKey, { - redeemPeriod: new BN( - params.redeemPeriod - ? params.redeemPeriod * 86400 - : vaultDetails.redeemPeriod, - ), + redeemPeriod: params.redeemPeriod + ? new BN(params.redeemPeriod * 86400) + : null, maxTokens: params.maxTokens ? numberToSafeBN(params.maxTokens, spotPrecision) - : vaultDetails.maxTokens, + : null, minDepositAmount: params.minDepositAmount ? numberToSafeBN(params.minDepositAmount, spotPrecision) - : vaultDetails.minDepositAmount, + : null, managementFee: params.managementFee ? new BN(params.managementFee) .mul(PERCENTAGE_PRECISION) .div(new BN(100)) - : vaultDetails.managementFee, + : null, profitShare: params.profitShare ? new BN(params.profitShare) .mul(PERCENTAGE_PRECISION) .div(new BN(100)) .toNumber() - : vaultDetails.profitShare, + : null, hurdleRate: params.hurdleRate ? new BN(params.hurdleRate) .mul(PERCENTAGE_PRECISION) .div(new BN(100)) .toNumber() - : vaultDetails.hurdleRate, + : null, permissioned: params.permissioned ?? vaultDetails.permissioned, }); @@ -234,6 +280,12 @@ export async function updateVault( } } +/** + * Get information on a particular vault given its name + * @param agent + * @param vaultName + * @returns + */ export async function getVaultInfo(agent: SolanaAgentKit, vaultName: string) { try { const { vaultClient, cleanUp } = await initClients(agent); @@ -241,15 +293,20 @@ export async function getVaultInfo(agent: SolanaAgentKit, vaultName: string) { vaultClient.program.programId, encodeName(vaultName), ); - const vaultDetails = await vaultClient.getVault(vaultPublicKey); + const [vaultDetails, vaultBalance] = await Promise.all([ + vaultClient.getVault(vaultPublicKey), + getVaultAvailableBalance(agent, vaultPublicKey.toBase58()), + ]); await cleanUp(); const spotToken = MainnetSpotMarkets[vaultDetails.spotMarketIndex]; const data = { name: vaultName, + delegate: vaultDetails.delegate.toBase58(), address: vaultPublicKey.toBase58(), marketName: `${spotToken.symbol}-SPOT`, + balance: `${vaultBalance} ${spotToken.symbol}`, redeemPeriod: vaultDetails.redeemPeriod.toNumber(), maxTokens: vaultDetails.maxTokens.div(spotToken.precision).toNumber(), minDepositAmount: vaultDetails.minDepositAmount @@ -340,7 +397,7 @@ export async function requestWithdrawalFromVault( return await vaultClient.managerRequestWithdraw( vaultPublicKey, new BN(amount.toFixed(0)), - WithdrawUnit.SHARES, + WithdrawUnit.TOKEN, ); } @@ -349,7 +406,7 @@ export async function requestWithdrawalFromVault( const tx = await vaultClient.requestWithdraw( vaultDepositor, new BN(amount.toFixed(0)), - WithdrawUnit.SHARES, + WithdrawUnit.TOKEN, ); await cleanUp(); @@ -406,7 +463,7 @@ async function getIsOwned(agent: SolanaAgentKit, vault: string) { const { vaultClient, cleanUp } = await initClients(agent); const vaultPublicKey = new PublicKey(vault); const vaultDetails = await vaultClient.getVault(vaultPublicKey); - const isOwned = vaultDetails.delegate.equals(agent.wallet.publicKey); + const isOwned = vaultDetails.manager.equals(agent.wallet.publicKey); await cleanUp(); @@ -461,10 +518,13 @@ export async function tradeDriftVault( price?: number, ) { try { - const { driftClient, vaultClient, cleanUp } = await initClients(agent); - const [isOwned, vaultDetails, driftLookupTableAccount] = await Promise.all([ + const { driftClient, cleanUp } = await initClients(agent, { + authority: new PublicKey(vault), + activeSubAccountId: 0, + subAccountIds: [0], + }); + const [isOwned, driftLookupTableAccount] = await Promise.all([ getIsOwned(agent, vault), - vaultClient.getVault(new PublicKey(vault)), driftClient.fetchMarketLookupTableAccount(), ]); @@ -474,34 +534,11 @@ export async function tradeDriftVault( ); } - driftClient.authority = new PublicKey(vault); - driftClient.activeSubAccountId = 0; - vaultClient.driftClient = driftClient; - const usdcSpotMarket = driftClient.getSpotMarketAccount(0); if (!usdcSpotMarket) { throw new Error("USDC-SPOT market not found"); } - const usdcPrecision = TEN.pow(new BN(usdcSpotMarket.decimals)); - const vaultWithdrawalsRequested = convertToNumber( - vaultDetails.totalWithdrawRequested, - usdcPrecision, - ); - // this is actually the authority provided - const user = driftClient.getUser(); - const currentVaultBalance = - convertToNumber(user.getNetSpotMarketValue(), QUOTE_PRECISION) + - convertToNumber(user.getUnrealizedPNL(true), QUOTE_PRECISION); - const availableBalanceInUSD = - currentVaultBalance - vaultWithdrawalsRequested; - - if (amount > availableBalanceInUSD) { - throw new Error( - "Insufficient balance: You don't have enough balance to make this trade", - ); - } - const perpMarketIndexAndType = getMarketIndexAndType( `${symbol.toUpperCase()}-PERP`, ); @@ -569,12 +606,14 @@ export async function tradeDriftVault( instructions.push(instruction); } + const latestBlockhash = await driftClient.connection.getLatestBlockhash(); const tx = await driftClient.txSender.sendVersionedTransaction( await driftClient.txSender.getVersionedTransaction( instructions, [driftLookupTableAccount], [], driftClient.opts, + latestBlockhash, ), ); From 2f05af13cb4e458ee7b250e577e2d7fe57ea2735 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Tue, 14 Jan 2025 20:33:18 +0100 Subject: [PATCH 18/32] fix: drift vault deposits and withdrawals --- README.md | 33 ++++++++++++++++++++++++++-- src/actions/drift/vaultInfo.ts | 8 +++---- src/tools/drift/drift_vault.ts | 40 ++++++++++++++++++++++++---------- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7b73eb4..6a1a2c8 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ Anyone - whether an SF-based AI researcher or a crypto-native builder - can brin - Pyth Price feeds for fetching Asset Prices - Register/resolve Alldomains - Perpetuals Trading with Adrena Protocol + - Drift Vaults, Perps, Lending and Borrowing - **Solana Blinks** - Lending by Lulo (Best APR for USDC) @@ -309,6 +310,34 @@ const signature = await agent.closePerpTradeLong({ const { signature } = await agent.closeEmptyTokenAccounts(); ``` +### Create a Drift account + +Create a drift account with an initial token deposit. + +```typescript +const result = await agent.createDriftUserAccount() +``` + +### Create a Drift Vault + +Create a drift vault. + +```typescript +const signature = await agent.createDriftVault({ + name: "my-drift-vault", + marketName: "USDC-SPOT", + redeemPeriod: 1, // in days + maxTokens: 100000, // in token units e.g 100000 USDC + minDepositAmount: 5, // in token units e.g 5 USDC + managementFee: 1, // 1% + profitShare: 10, // 10% + hurdleRate: 5, // 5% + permissioned: false, // public vault or whitelist +}) +``` + +### Deposit into a Drift Vault + ## Examples ### LangGraph Multi-Agent System @@ -357,7 +386,7 @@ Refer to [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines on how to co Apache-2 License -## Funding +## Funding If you wanna give back any tokens or donations to the OSS community -- The Public Solana Agent Kit Treasury Address: @@ -365,4 +394,4 @@ Solana Network : EKHTbXpsm6YDgJzMkFxNU1LNXeWcUW7Ezf8mjUNQQ4Pa ## Security -This toolkit handles private keys and transactions. Always ensure you're using it in a secure environment and never share your private keys. \ No newline at end of file +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/src/actions/drift/vaultInfo.ts b/src/actions/drift/vaultInfo.ts index 279f78b..3343f2f 100644 --- a/src/actions/drift/vaultInfo.ts +++ b/src/actions/drift/vaultInfo.ts @@ -2,8 +2,6 @@ import { z } from "zod"; import type { Action } from "../../types"; import { getVaultInfo } from "../../tools"; import type { SolanaAgentKit } from "../../agent"; -import { decodeName } from "@drift-labs/vaults-sdk"; -import { MainnetSpotMarkets, PERCENTAGE_PRECISION } from "@drift-labs/sdk"; const vaultInfoAction: Action = { name: "DRIFT_VAULT_INFO", @@ -13,7 +11,7 @@ const vaultInfoAction: Action = { [ { input: { - vaultName: "test-vault", + vaultNameOrAddress: "test-vault", }, output: { status: "success", @@ -35,11 +33,11 @@ const vaultInfoAction: Action = { ], ], schema: z.object({ - vaultName: z.string(), + vaultNameOrAddress: z.string().describe("Name or address of the vault"), }), handler: async (agent: SolanaAgentKit, input) => { try { - const vaultInfo = await getVaultInfo(agent, input.vaultName as string); + const vaultInfo = await getVaultInfo(agent, input.vaultNameOrAddress); return { status: "success", diff --git a/src/tools/drift/drift_vault.ts b/src/tools/drift/drift_vault.ts index a65c485..541c117 100644 --- a/src/tools/drift/drift_vault.ts +++ b/src/tools/drift/drift_vault.ts @@ -19,6 +19,7 @@ import { import { VaultAccount, WithdrawUnit, + decodeName, encodeName, getVaultAddressSync, getVaultDepositorAddressSync, @@ -65,9 +66,13 @@ async function getOrCreateVaultDepositor(agent: SolanaAgentKit, vault: string) { return vaultDepositor; } catch (e) { // @ts-expect-error - error message is a string - if (e.message === "Account not found") { - await vaultClient.initializeVaultDepositor(vaultDepositor); + if (e.message.includes("Account does not exist")) { + await vaultClient.initializeVaultDepositor( + vaultPublicKey, + agent.wallet.publicKey, + ); } + await new Promise((resolve) => setTimeout(resolve, 2000)); await cleanUp(); return vaultDepositor; } @@ -280,18 +285,29 @@ export async function updateVault( } } +export const validateAndEncodeAddress = (input: string, programId: string) => { + try { + return new PublicKey(input); + } catch { + return getVaultAddressSync(new PublicKey(programId), encodeName(input)); + } +}; + /** * Get information on a particular vault given its name * @param agent - * @param vaultName + * @param vaultNameOrAddress * @returns */ -export async function getVaultInfo(agent: SolanaAgentKit, vaultName: string) { +export async function getVaultInfo( + agent: SolanaAgentKit, + vaultNameOrAddress: string, +) { try { const { vaultClient, cleanUp } = await initClients(agent); - const vaultPublicKey = getVaultAddressSync( - vaultClient.program.programId, - encodeName(vaultName), + const vaultPublicKey = validateAndEncodeAddress( + vaultNameOrAddress, + vaultClient.program.programId.toBase58(), ); const [vaultDetails, vaultBalance] = await Promise.all([ vaultClient.getVault(vaultPublicKey), @@ -302,7 +318,7 @@ export async function getVaultInfo(agent: SolanaAgentKit, vaultName: string) { const spotToken = MainnetSpotMarkets[vaultDetails.spotMarketIndex]; const data = { - name: vaultName, + name: decodeName(vaultDetails.name), delegate: vaultDetails.delegate.toBase58(), address: vaultPublicKey.toBase58(), marketName: `${spotToken.symbol}-SPOT`, @@ -346,9 +362,10 @@ export async function depositIntoVault( try { const vaultPublicKey = new PublicKey(vault); - const [isOwned, vaultDetails] = await Promise.all([ + const [isOwned, vaultDetails, vaultDepositor] = await Promise.all([ getIsOwned(agent, vault), vaultClient.getVault(vaultPublicKey), + getOrCreateVaultDepositor(agent, vault), ]); const spotMarket = driftClient.getSpotMarketAccount( vaultDetails.spotMarketIndex, @@ -365,7 +382,6 @@ export async function depositIntoVault( return await vaultClient.managerDeposit(vaultPublicKey, amountBN); } - const vaultDepositor = await getOrCreateVaultDepositor(agent, vault); const tx = await vaultClient.deposit(vaultDepositor, amountBN); await cleanUp(); @@ -396,7 +412,7 @@ export async function requestWithdrawalFromVault( if (isOwned) { return await vaultClient.managerRequestWithdraw( vaultPublicKey, - new BN(amount.toFixed(0)), + numberToSafeBN(amount, QUOTE_PRECISION), WithdrawUnit.TOKEN, ); } @@ -405,7 +421,7 @@ export async function requestWithdrawalFromVault( const tx = await vaultClient.requestWithdraw( vaultDepositor, - new BN(amount.toFixed(0)), + numberToSafeBN(amount, QUOTE_PRECISION), WithdrawUnit.TOKEN, ); From fd95ac86824106a7ffd294c58d4bea8e2389dea1 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Tue, 14 Jan 2025 21:07:24 +0100 Subject: [PATCH 19/32] chore: drift integration docs --- README.md | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/README.md b/README.md index 6a1a2c8..6fdedb8 100644 --- a/README.md +++ b/README.md @@ -338,6 +338,139 @@ const signature = await agent.createDriftVault({ ### Deposit into a Drift Vault +Deposit tokens into a drift vault. + +```typescript +const signature = await agent.depositIntoDriftVault(100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU") +``` + +### Deposit into your Drift account + +Deposit tokens into your drift account. + +```typescript +const {txSig} = await agent.depositToDriftUserAccount(100, "USDC") +``` + +### Derive a Drift Vault address + +Derive a drift vault address. + +```typescript +const vaultPublicKey = await agent.deriveDriftVaultAddress("my-drift-vault") +``` + +### Do you have a Drift account + +Check if agent has a drift account. + +```typescript +const {hasAccount, account} = await agent.doesUserHaveDriftAccount() +``` + +### Get Drift account information + +Get drift account information. + +```typescript +const accountInfo = await agent.driftUserAccountInfo() +``` + +### Request withdrawal from Drift vault + +Request withdrawal from drift vault. + +```typescript +const signature = await agent.requestWithdrawalFromDriftVault(100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU") +``` + +### Carry out a perpetual trade using a Drift vault + +Open a perpertual trade using a drift vault that is delegated to you. + +```typescript +const signature = await agent.tradeUsingDelegatedDriftVault({ + vault: "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", + amount: 500, + symbol: "SOL", + action: "long", + type: "limit", + price: 180 // Please long limit order at $180/SOL +}) +``` + +### Carry out a perpetual trade using your Drift account + +Open a perpertual trade using your drift account. + +```typescript +const signature = await agent.tradeUsingDriftPerpAccount({ + amount: 500, + symbol: "SOL", + action: "long", + type: "limit", + price: 180 // Please long limit order at $180/SOL +}) +``` + +### Update Drift vault parameters + +Update drift vault parameters. + +```typescript +const signature = await agent.updateDriftVault({ + name: "my-drift-vault", + marketName: "USDC-SPOT", + redeemPeriod: 1, // in days + maxTokens: 100000, // in token units e.g 100000 USDC + minDepositAmount: 5, // in token units e.g 5 USDC + managementFee: 1, // 1% + profitShare: 10, // 10% + hurdleRate: 5, // 5% + permissioned: false, // public vault or whitelist +}) +``` + +### Withdraw from Drift account + +Withdraw tokens from your drift account. + +```typescript +const {txSig} = await agent.withdrawFromDriftAccount(100, "USDC") +``` + +### Borrow from Drift + +Borrow tokens from drift. + +```typescript +const {txSig} = await agent.withdrawFromDriftAccount(1, "SOL", true) +``` + +### Repay Drift loan + +Repay a loan from drift. + +```typescript +const {txSig} = await agent.depositToDriftUserAccount(1, "SOL", true) +``` + +### Withdraw from Drift vault + +Withdraw tokens from a drift vault after the redemption period has elapsed. + +```typescript +const signature = await agent.withdrawFromDriftVault( "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU") +``` + +### Update the address a Drift vault is delegated to + +Update the address a drift vault is delegated to. + +```typescript +const signature = await agent.updateDriftVaultDelegate("41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", "new-address") +``` + ## Examples ### LangGraph Multi-Agent System From a65463a77bffd908a8a210659b65e798c1225af4 Mon Sep 17 00:00:00 2001 From: aryan Date: Wed, 15 Jan 2025 02:55:30 +0530 Subject: [PATCH 20/32] chore: docs + lint --- docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/classes/SolanaAgentKit.html | 37 +++++++--- docs/functions/createSolanaTools.html | 2 +- docs/functions/createVercelAITools.html | 2 +- docs/functions/executeAction.html | 2 +- docs/functions/findAction.html | 2 +- docs/functions/getActionExamples.html | 2 +- docs/index.html | 67 ++++++++++++++++++- docs/interfaces/Action.html | 14 ++-- docs/interfaces/ActionExample.html | 4 +- docs/interfaces/BatchOrderPattern.html | 4 +- docs/interfaces/CollectionDeployment.html | 4 +- docs/interfaces/CollectionOptions.html | 4 +- docs/interfaces/Config.html | 5 +- docs/interfaces/Creator.html | 4 +- docs/interfaces/FetchPriceResponse.html | 4 +- docs/interfaces/FlashCloseTradeParams.html | 4 +- docs/interfaces/FlashTradeParams.html | 4 +- docs/interfaces/GibworkCreateTaskReponse.html | 4 +- docs/interfaces/HeliusWebhookIdResponse.html | 6 ++ docs/interfaces/HeliusWebhookResponse.html | 3 + docs/interfaces/JupiterTokenData.html | 4 +- .../LuloAccountDetailsResponse.html | 4 +- .../interfaces/MintCollectionNFTResponse.html | 4 +- docs/interfaces/OrderParams.html | 4 +- docs/interfaces/PriorityFeeResponse.html | 5 ++ docs/interfaces/PumpFunTokenOptions.html | 4 +- docs/interfaces/PumpfunLaunchResponse.html | 4 +- docs/interfaces/PythFetchPriceResponse.html | 4 +- docs/interfaces/PythPriceFeedIDItem.html | 4 +- docs/interfaces/PythPriceItem.html | 4 +- docs/interfaces/TokenCheck.html | 4 +- docs/modules.html | 2 +- docs/types/Handler.html | 2 +- docs/variables/actions.html | 2 +- src/tools/drift/drift_vault.ts | 2 - 37 files changed, 167 insertions(+), 68 deletions(-) create mode 100644 docs/interfaces/HeliusWebhookIdResponse.html create mode 100644 docs/interfaces/HeliusWebhookResponse.html create mode 100644 docs/interfaces/PriorityFeeResponse.html diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 94a19ed..3a34b45 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJyNllGTkzAQgP9LnjvWq96pfaut1ep57dwxvjg+7IWlZAgJkyzajuN/d0o7B5Sw8MID++23sMkSfv4VhAcSc/FkNRhY7NHQN0ViIgqgVMyF1OA9+mk7/iqlXIuJyJSJxfxm9v7f5MW0kKSsqQ3KELoEJPrpOdROnt3edZI/HSAvNDKOC8GpPgLJdOtidDsgQhd+pA7FKZdWa6zqr7DQ9pijoaA1BI4Tb4vT1Q9YLxSvNIna93hOITbZIZB14exzjEtfI8l055TER/SFNT68lF2MlWrw6VJbj5GDGHfgIA/3KUgOqkdZRwo/q+c/1mVVqzACnz1ifxv6YK7A17JQhC6yGZoVEATF1xAnvC+1XUhpS0MrJFDas0vXj3NFvitD9SZ+WEdsjV6aK3EZ5d5VbMQ5za7Mi6Q091AambJPGSSH1OvSVKvCTXuAY7VHSkfOXRgdklfwGjHerDaEea/5ihulHRYOqao2LVOUWdBThznJFzCxxsZnj44F+unl9lXm6w/vbm5nzbNrGW22D0919m9wCp716dA6h9qGN81kWU3/+ZSNrNWNPZGUppoAP+1AbeHd247wBzqJerEZULYwRooHlCXh9RFf61oAI0qUifstdZRR7JFa/wLB1+tAHeGv/7OFIBQ=" \ No newline at end of file +window.navigationData = "eJyNllGTkzAQgP8Lzx3r9bxT+1Zbq+h57dwx3oPjwzZsS4aQMMmi7Tj+d6fQEShh4YUH9ttvYSGb/PgTEB4pmAfPRoGGxQE1fZUUTIIcKAnmgVDgHLppO/4qoUwFkyCVOg7mN7N3fyf/TQtB0ujaIDWh3YNAN61C7eTZ3X0n+eMRslwh47gQnOoDkEg2Nka7BSK0/kfqUJxyaZTCsv4Kc2VOGWryWn3gOPEmP1/dgPVC8Uq9l4cezznEJlsEMtafXcW49DWSSLZWCnxClxvt/J+yi7FSBS5ZKuMwshDjFixk/j55yUH1KOtI4Se5+21sWrYKI3DpE/a3oQ/mCnxGJQv3grvEmDSM2Tb3sKP14+Vj1F+KXBLayKSoV0DgtV5DnPChUGYhhCk0rZBAKsc+cD/OFfkmNdXL73EdsTV6aa7EZQj1/n+NOKfZWmmspNMa+cXn4VhtkeX7Qj9AoUXCi33kkHpd6PJjc+PPw7HaEyUjB5EfHZKX8BoxDlchYdZrvuJGaYeFQ6qyTcsERer11GF2DoCOFTb2ATrl50Vf3b7KfP3+7c3drLmZL6Nw8/hcZ/8CK2Gnzrt4FWobbpvJohyH1bEjMkY1/ol9ocuF5aYdqC28f9MRfkcrUC3CAWULY6R4RFEQXp95al0LYER7qeN+Sx1lFAek1uHI+3odqCP8+Q8guIFL" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index e086ffb..68faf85 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "eJy1XW1zqzaw/i/O10zrFRjb55ubOG3avN3Ep72dTIchtpzQYKCAc5rb6X+/IwnslViwsOmncybWrh6kRytpHwn+GWTJt3zw5fmfwXsYrwZfgE3OB3Gw4YMvg6ckCuJg9srj4pewGJwPtlk0+DJYRkGe8/x7/efv3opNNDivfh18GQz+Pa+8joDtvC6TOC+y7bJIMhuXZ3p55P58kAYZj4s60n3FMGQurjnmyyJMYtuK98VPqfdbEEXcqv3OdkVPr88PVquM53mHepHJie28Dl9t21gV7VgfG7p7nmb8ry3Pi6tgu+TF1TZe2T1zabaWZuvS7BQcK55Gyecieed2BFPli7L86TVfJFHUgd/KaImNTsHwyosfgiiIl9yq9ldevOyK91PvffHG7WLKvvKktDkFwSaMi7urhVXNomy8PmKEazUWWRDna8uHRYVPG2WvYV7w7DLZBKEdwyqTVWVyWv15En3wpyTqhEAa5UnUC4ZXXjxk4SbIPjtgeOVFqox6wVBkwcpuiFUlT6ktCjdhcZ+tLLkmiydl8VPqfQmK5Zt9vbJ4H/UuRVCIZlEk67abSJRNEEVJZXMKgm9h8bbKgm+zKLKbusvyQRSdWHOS8viBZ+lC8OYmie2mcGGV8iyVbIuUVW8ont6SzG7lpMHIS7OTmBAlOT8CiLT7D5FYd4wOpIeeiXi8muU5L+yGhSgeVMVPjLqLhyfbWFukfdQnFmWXQRH88DnrsIwW1QvLVVAEL59Hr6Zb0CzC5bv9IgeBKSrDU7CsebF8k2gestByoSdtJJC0tDmJg8E2Xr49bDfp1Ta2X2ors3S7SdfbuI8Vd14E73bPX5U8ce1jXd++7EnPx+PVRbJJBYH5ahZmqyxJ7Z6Xx6vlzjLYWZ40J2TL4EJGwSQPrTc4wkoFwb3VySgyHhT84ub21h6CNFlGm01v9T+F8WvEn8IVX92Ef23DVVh8PiSJ3YJhjymXbnLhJqrcpMrNqTivxKivessueAozGSxSZHYqjvuUxxc8LnjGVxWc38Libdds1tDEAmNZeqoQirVXhDz1gRb1bWe2C4yoU3vifbmJmkXlzss2vSKtgqjcevUwD95/i/mqI4xXXiTCrHccJYirJFvcXHaCUuJYJ1kRrU5Hs2+Qxc2ldaPs26OITs58KRSP5Xb/mD4KoijbmffZV7dBGO/hdNu2i7J7LP1kMYLPVbjdqDA+22x+de0GkzJTYTvYbD7cPnFcqLmpI4weZjQdRXoUivT0eTXl8UuSvCsYt0H2bpmtrwwVkk1leFIuMYjDNc+Lzlgqwx6xiGzXZ/Eml/pXnK+urcNc+lm8ydX+mvNV2EOM2+HojODUvbdszh/Dl29J9r4I8ne7rbe0elVWhbI6aZwky/eHIOXZ0zLM88QyLyWsUmGV761Ob4tFmEZh3KUdip3FSXlPHudJdhPm1rl2ZRGFeR8Zd+nrQmb6BIbQMgmj7FSGMNrZnZwNmm/SQilNs+Uy2caWKRlpy4Wt3AMHe9t+sgKPPE2y4mm7EdnujtmBTNrmO9t+EF3yIggjvlLIOkJalcZZZXwSpijI38QCf2GdwJcmYpLpI5MvnclNdEcAkjR9IFDRwLkJRGqhk1RZWkaBSC30pFciNHdry9TuHsbpEUU5e/prG6zy221UhLmtZq727tJwszc8UT8WW8VF0glIaVUkPaGohMqrLNl0AlIZrrNk0xMW1cgViocsSZM8sMuvlCuw0jTdm56CJ0jTLPk4DlBp2zOijP/Jl8VRgJRpz3j433y53XfZQnAisA8xpXkFqtDMO+LyXHOUy5KLJIn28/R6G0v3+fe1Mq1nqWrOf+WZkCyv291rpVorcPZntWYXi+v7u7308hFkYfAS8fz78pdWR9qhoN9mNzfzhT+7vHycPz35yv6A4zPfLz5Trh9O8g/0SuVA2TbBuZw/3Nz/7i/uf5nfdQKjTs34cn3QD5QfZjezu4t5JxTl6ZV+ACweZ3dPV/PHTgiqmNtrd1zc39zMpcExfbJfGvQD6vb6buHfXS06YREHfPx4XfTWNZfdmCEXav1U/jj/n6/zp4V/9fXustuILY/W+fJUXV9gnu5vfp37l/e3s+tu9Cgz0b5K4PUD58f5ogwel7PFrBOcV16U4UMosz3CeejWSRJH2lP3XM0XFz/5D4/XHQOZ3Gz5MlPTD5CnxeyXuf/b9eIn/+evD52wSN3UF5qO/+c27R3O0/3N7PeOURZBypMo+Owr3j7Of7x+WswfjxtOKk/f63i6md9d+rOnp3m3aCvOmPjykEk/MC4e57PF3P/x+off7h9/8Rezp1864VFrLb/M/Pki9ddv+Hu6vzklBOZJ1Gu3Pfy++Mk/duyLHK3fewAQofD+t7v5ZdlOT/7V/aO/uLnsHBylWFc2V+6vk8wvolV/IB8er29nj78f050CXXmmtPdZbXZzs2u5xU3HiV8AC6Jo12hCW+y7WzHA47oUI+wzbFzfzn7sNgTKeBFugtce6a/4hJrpSIopYqHG+i+4Vk1FJ/asgLlXkPvv4sfZ75fXX2/9sqsvHm5vu0VgJVr6ZY8L2fI/ATa7vfV/dU+BFmw2/ofb68C4f7yY+U/Xdz/ezP2n68v5pf/bT9ePNw/39zfHDBchqPjqnIsvD7r4397CLBJHl3pajcy+3okp7evtw9XXuyOyBOq8oV8eOOwzW3B1M3v6yb9/mN/53TeHMp/vC0XB73GfqCBd3Nw/zY/GJEWGPkGVzLv9erO4frr+8RiaVbnA3lIc90/XYtd4HKgy2+4XSc/Adumfq8f72+Ow7ZJBIgPfMzyzIx8e7x/un2ZHBY4dsirn3A/E2cPD4/2vp2Is0/T/FcjH+c/zi8WJGFXm/r+COP/f+cXXk/u6zOT3CJKNvD0d9cutoTgQug6WPP9e/WKfERcxfHbtzx6u/V/mvx/wKM8aBaEfpKH/zpv18RJeQ5U/f324Frv+x/nV/PFRtuvF/de7xaHK/9ymodjxZ3zNs0y2pDw5cCKMq/nc/wHd7DhQ+5pz/6Xldkd7pWqWeni8/vX6Zv7j/FClalpKs/AjjPhrs/Rdq1Qjiwg76J47rkv9ZE8X8zp3g6+zQ7dOKkwN1aRCJ4qL4JUfrEkraluZPpaqhP19qp8T1zrFKGTfZPIfa5dnZfGmfjaxNlS6zcIOdarSJ1aZJZ9BVHz+EORh/pCE+DTQYQSl8YswTivjEwEtVbd3gYFMuldOk+pSykIbHhftOPbl7Km115rM+2E2VZztzQ8OV+pxGkDl4WscFNvsAOlNMNjsKBC4+W/DuNgXv7taPPI8TeKcxNRY2L4jhN7W3fVZaUY/bvMzNIHgRSDEnGOA7E2PB4M7AN+NawmrRDH7Ri++hUXByXmtye/Z3oZ+Tgp3U/U84q9ZsOlW/97oZADf+EseFiSlG+vf25xcfRiHRRhEuztMT/c3naCU9rubS3nLla8OsPIoTNPglf+QdmLcWWXXtrbrACPNwiQLi88r3q2DKrs1P7aTzGG43sY3MhHUFgPJgvZDsTXmN/u2CPr0E3QMwy0IWkNwt8rLGPqVXnq1YSgt25ZhnaDwLKPX+y0gKpvjqseku9lGSXkgXB18ztuY11y6w0yQFEH0axBtj6nhTFp/lNb047c8UmN0FBJAXsyDLOarY2BVHnjloS9oGQ+iItzwWfp5DK7KPEibEwDdQeW8ENcSyJh9CBGyPQEOpvDParO/e+UBhcos08smmnR6cDddg9txK0rX2roTta0y/9y8oCvhByvdlT+t2hVfhpsg6tDGyOK0qouAZjFdbVn6tCqj5DX5+nhtX6swaJttrJs5CKNP/yOJtl2IZVidBmGdcf5/3A+2xZtcONnDICxPgyJPXR4BpGZ3GoyUZ5sg5nHhr8RuI6C3CDQU0vY0OPxvcf2saQdIw9BsOlePI7l6BYQ42NO2CKmX6rD2LYJiSz5bg9eznQX9ZATkxnXPO4+vydVFU93SpOUyrH3l8rTUdfz16fKiCwBpFsbbfLXsAcSG53lDlrgJwN7k1MqXyapTzWX5I6rV9nSfxZsdq+mSfTC7xfMhdjfAb2P4U+Maog2HND2wnOgGJiXuoFuCsbmHfgSYo2D0BKBl6LVBODT8uoFoGoJtCFqH4cHq8VAsb+Sr1ySIe/nigm/DYGwq28dwbPV9aEA2PkTj+jZ/p+ecdhjCroX9XWG0ppwONMjBrJMFGMyDmcyKz/8ONmlE4tEK2Pd4GKdbMqFV93dWlW04VaAhbKgu2Rb29e0Kn1Ah/zsV1w2165HtteoW3apmw+kYRvt7hT8F8SpC+oG86vB9+dfWTqr3fTP804Vi5Kd9T15CaRwwmzDiZPzANeyLHVPJiufLLEwtmuRML3pMZVx18cFHQuWOarjlG9+QKSCt3apSx1TxZlCxoY59MctKMFHlTunijS/fqWr2v3ZJu8p3cCZNKpjh86x8/2bSKoAhmG3VLsThKNs6C1X42AqzMH8nSWZWVhU8tqJ8mdDzmVlRVbBDReYWAr1Q6brgtIpZL9Zh7iKXCE0uzw6si020TZnVosjCl21Bx4TGyjWzY0CQjXuwWbs16EsY4/fZtDo82xU+8DRtjZkGWU5LF0SFu8LdKsQNJ192/hBkwYbsPfSzfaP9tQ3ioiEZZzo8Q4Xpp8AIG2dZekNSq6wseHRFjfu/Wk3tmz66KtwvP+zegv8QiMMT5MxeK9RFPKabjHbZ3nB1rG2S4f+0sKOhdml3kCjWMGTfPAYxvY9uwCCNstLoRAB5Gizxa8Qs2n9ncWLV8XbzwrP7tfGRg8MIlGGyPvClA2sgYbwKP8LV9ihC7I1PYoWWsxanfuX7sZqjoVmm46rN2uVZ+3vKa1A7jnG6ztYhblulON0YFDwLoq85nSIn696bbfOWNLkliIh/8KwpQU3Wjyw6V10j0f5NaweYZBbsi06kXxtO1ZAfQyy69sPsaqkcvfhoHcYrY/e/f9/R/sfWpvTwblbeGGn0qP1u61S8ExmnQ6hXM9XKUM7/OBdhkv89+PLP4INnQpsbfBmw75zvpoPzwTrk4v3NX56rJMYy2ZRHnlfJciv/+0dZ7Fe+lEesvzyr0t8PB+fPw/PR8DsYen/8cf5cGcsf5B8qH/u/SEMYnD8DZQg1Q9AM2eD8mVGGrGbINENncP7sUIZOzdDRDN3B+bNLGbo1Q1czHA3On0fnrvvddDrRDEc1w5Fm6A3Onz2qRq9m6GmG48H585gyHNcMx5rhZHD+PKEMJzXDiWY4HZw/TynDac1wqhNA8AFI7kCdPGCwR9KH5g9BIJ1BIHgBJIegTiLQWQSCG0DyCOpEAp1JIPgBJJegTibQ2QSCIzAijeuEAp1RIHgCJKegTirQWQWCK0DyCurEAp1ZIPgCJLegTi7Q2QWCM0DyC+oEA51hTHCGkQxjdYYxnWFMcIaRDGN1hjEjRskgRUcpIkzpDGOCM4xkGKszjOkMY4IzjGQYqzOM6QxjgjOMZBirM4zpDGOCM4xkGKszjOkMY4IzjGQYqzOM6QxjgjOMZBirM4zpDGOCM4xkGKszjOkMcwRnHJJhTp1hjs4wR3DGIRnm1Bnm6AxzBGcckmFOnWGOMRPKqZCeC4nJUGeYIzjjkAxz6gxzdIY5gjMOyTCnzjBHZ5gjOOOQDHPqDHN0hjmCMw7JMKfOMEdnmCM445AMc+oMc3SGOYIzDskwp84wR2eYKzjjkgxz6wxzdYa5gjMuyTC3zjBXZ5grOOOSDHPrDHN1hrmCMy7JMLfOMNdYb8kFF73iIpZcOsNcwRmXZJhbZ5irM8wVnHFJhrl1hrk6w1zBGZdkmFtnmKszzBWccUmGuXWGuTrDXMEZl2SYW2eYqzNsJDgzIhk2qjNspDNsJDgzIhk2qjNspDNsJDgzIhk2qjNspDNsJDgzIhk2qjNspDNsJDgzIhk2qjNsZKzq5bKeZNiIWNjrDBsJzoxIho3qDBvpDBsJzoxIho3qDBvpDBsJzoxIho3qDBvpDBsJzoxIho3qDBvpDPMEZzySYV6dYZ7OME9wxiMZ5tUZ5ukM8wRnPJJhXp1hns4wT3DGIxnm1Rnm6QzzBGc8kmFenWGezjBPcMYjGebVGeYZe0e5eaR3j8T2UWeYJzjjkQzz6gzzdIZ5gjMeyTCvzjBPZ5gnOOORDPPqDPN0ho0FZ8Ykw8Z1ho11ho0FZ8Ykw8Z1ho11ho0FZ8Ykw8Z1ho11ho0FZ8Ykw8Z1ho11ho0FZ8Ykw8Z1ho11ho0FZ8Ykw8Z1ho11ho0FZ8Ykw8Z1ho2NDIVMUdA5CiJJoTNsLDgzJhk2rjNsrDNsLDgzJhk2rjNsrDNsIjgzIRk2qTNsojNsIjgzIRk2qTNsojNsIjgzIRk2qTNsojNsIjgzIRk2qTNsojNsIjgzIRk2qTNsojNsIjgzIRk2qTNsojNsIjgzIRk2qTNsojNsIjgzIRk2qTNsYuTBZCKMzoQRqTCdYRPBmQnJsEmdYROdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVOdYVPBmSnJsGmdYVMj2yrTrXS+lUi4mhlXlXJtyLlSSVcj6zqUadchnXcdEonXoZF5HcrU65DOvQ6J5OvQyL4OZfp1SOdfh0QCdmhkYIcyBTukc7BDIgk7NLKwQ5mGHdJ52CGRiB0amdihTMUO6VzskEjGDo1s7FCmY4d0PnZIJGSHRkZ2KFOyQzonOySSskMjKzuUadkhnZcdEonZocFElfxvyP5T6f9a/l8JAA0KACUBGExUIkCDCkDJAKYOoISABiWAkgJMLUCm90l5CCgxwFQDlBzQICZQgoCpCChJoEFQoEQBUxVQskCDqEAJA6YyoKSBBmGBEgdMdUDJAw3iAiUQGAoBMMXDKdkLhEgAhkoAMvEPtMgAhFAAhlIATIlRNJEJsQAMtQCkAACMnbvwnec4hgOCh4ZiAFIEAFpwAEI0AEM1ACkEAC06ACEcgKEcgBQDgBYegBAPwFAPQAoCQIsPQAgIYCgIIEUBoAUIIEQEMFQEkMIAsAndCwQTDSUBpDgAtBABhJgAhpoAUiAAZ0hSmRAUwFAUQIoEQAsSQIgKYKgK4ChplA6phLAAhrIAUiwAWpgAQlwAQ10AKRgALU4AITCAoTCAFA2AFiiAEBnAUBlACgdAixRACA1gKA0gxQOghQogxAYw1AaQAgLQYgUQggMYigNIEQFowQII0QEM1QFcaBkLhPAAhvIALmuhMiE+gKE+gBQUgJZNgBAgwFAgwFVCPT0WCBECDBUCpLAAtHwChBABhhIBUlwAWkIBQowAQ40AKTAALaMAIUiAoUiAFBmAllKAECXAUCVACg1AyylACBNgKBMgxQagJRUgxAkw1AkYQcv0TggUYCgUMGItkyshUoChUsBIMZEejYRQAYZSASPFRHo0EmIFGGoFjNSxEXosEIIFGIoFSBECaJEHCNECDNUCpBABtNADhHABhnIBUowAWuwBQrwAQ70AKUgALfgAIWCAoWCAFCWAFn2AEDHAUDFAChNACz9ACBlgKBkgxQmgxR8gxAww1AyQAgWM6KhMCBpgKBogRQqgRSAgRA0wVA2QQgXQQhAQwgYYygZ46hATkMOZEDfAUDdAChbgMdoBwURD4QApWgAtCgEhcoChcoA3besFgomG0gFSvABaWQJC7ABD7QApYACtLgEheICheIAUMcDzyEYkRA8wVA+QQkZTNxLCBxjKB0gxo6kbCfEDDPUDxoqJDSfaCCYaCgiMvZZuJEQQMFQQGCsm0vMCIYSAoYTAeNKyyCLEEDDUEJACB9CKGxCCCBiKCEiRA2jVDQhRBAxVBKTQAbTyBoQwAoYyAlLsAFp9A0IcAUMdASl4wNghiUQIJGAoJCBFD6BVOCBEEjBUEpiMWhYYhFAChlICUvwAWsoDQiwBQy2BiTrcSc9MhGAChmICUgQBWtIDQjQBQzUBKYQALesBIZyAoZzAdNjSjYR4AoZ6AlPFxIZzpgQTDQUFpCgCtD4IhIgChooCUhgBWiMEQkgBQ0kBKY4ArRMCIaaAoaaAFEiA1gqBEFTAUFRAiiRA64VAiCpgqCoghRKgNUMghBUwlBWYqqPGNJUJcQUMdQWkYAK0dgiEwAKGwsKUwkLrh4xQWJihsDClsNAaIiMUFmYoLEwpLLSOyAiFhRkKC1MKC60lMkJhYYbCwpTCMmXnzvQ7YIY9cQbZEFiYEljo9QUjBBZmCCxMCSy0JskIgYUZAgtTAkvDExDHkQ19hSl9hdY1GaGvMENfYUpfobVNRugrzNBXmNJXaH2TEfoKM/QVpvQVWuNkhL7CDH2FKX2F1jkZoa8wQ19hSl+htU5G6CvM0FeYFEzYkMwiMUJhYYbCwpTCQtOAEFiYIbAwqZcwWi1lhMDCDIGFSb2E0WopIwQWZggsTOoljFZLGSGwMENgYVIvaWxDgojmFQwlsNBtSF3CMG9hqGsYtFzLqIsYtZsY8ioGLdcy8jKGwUN1HYOWaxl1IaP8m7x098Gzgq+u1eW75+dB9f2ofwZ+eSNPLB5lTeJynlgefvnn33/3d/C+/PMvuoYnfhOVKTe8emcV8uZNkbfxtIO3HPvBoMaWmKr3HCM0gNGwobIUSTYrhwe/ZoZrAlQTdKqg8l+5x35xc3qWrYneR4IATjwEcDqxcvUSREGMvmqM+meM+mds6axYvslb9zouzL6OjtLqlRLI39TZOxQTq5XH8oUnGNYEuxlauVmKxoqCKKreLYBh4da38ybuEfNNWnzKG8/l98o0ryMEcmTXeNJryrNUfqgySsS7GPYOGRp2zG7Y6Q7ztyQrNI+4Oxw7j/IVizimMNR43rgcxZZhwbiSj5AN0ZAVU5+tN+OrRwgoG+NwY9khO48r9LEn7BQPXGY31vZOk7QWW4XYjzwyS4/qo4GIfIh7ZZeAbZfEMa+FFNTJ1pDyItsu5efp0OOhh7PzI1/U6ERBvNq3mxaEEYc9Sw7vfcZrrT89NMQ8y/ZSn/58Ve+V9MW7MImQPEUPPu3y5Ma3u5FHFF4sZ4ym786i7hniQTK05POhj5/imXiIZ2LLyG3/VWb8JA5+ki7EKLtS9KQ2pJDDURd/rUsI1Itel17ME/m2zCSJ9KUZGqhjy5Gq/P21DVZ5BVWDiGKJN+rgsgjTKIz1NsRxqYuvD/EtyCgI6w+MemXcoVeMsKStdGzXALtPCuLwPcLh227e0r+agJyN8Nw6shuN+69dIEcuXuGM7AKbmvH8fdSlVprIr+V+onSrf7IceUQT6tiy+aRHenZA3Wo3upSz8jU2CBZCZeun8XPaOEph3g2tIQrXRUKOVtR+nm37ode14r0nXttM7B67/NYUph6e8l076u1f64rh4KlpYtdUh7/VjGMAnjHALpaUFdS9iaTCfslkuY4rvVVo5WfPiSGCWnRst5bQXq6M2xQHmIktyP0XPHCswmzx7GCtxevYffnSO6JD8KZ4Ykdl6VC9RG/39QSMEVPIs3tc6VLGg5X8wBRfZTw19lEeWtV4douavdvyJY6IOiioMruguvemwOXbzcbYNI+Q15Gl1zBeUczG+1Bm2dPyc9dyO+rLvSgZDDGFLLMDyrH4enmLXzwnD+2WHbXvc+NAgWlkmReR/uTzS5gae9AgtCWl7i0tXwGHOwlv7btgFE1Zh4hCju3YFs4a0InEPUJnF2rrH3XCIxvHbstsyysv/CCK/FWyCcI494tolVMbLcTKqR0pK88Zfw1z8a2/lVYRRVG8L7LMaIlahEPNt/qXegzU5FO78S8qSL7FB9FP0XiY2q0T9q4rt+skEz1AuUfxZmq3gBDu0ywUMbClRVBYmNpFBeFXrVzFVz2pOQthtUzXS58p1a4TBHBiDVBL/xtBwcOR227YCY9RVPaSGCLYo4uGndvF335k7J1rjlE7Wi4aX3lRpsS1TkZ93NFNUrwZ6XBtkNp6E8+2f0j1j/aoqJdd616Wg6eh7VCwdu2CdeWw9LZOsiLS8rEumqNcuznqlRflEKw/M+AZ2fqZ08/irbZawnvkkT2yylX15SbkEDWfpRj1ygu1QgyK4OWTSD7j3LNlllj3WYTLd52MDGsg1hNekeq4cECwnNtUdqxM8QT5e8brC20Pr5DGdh28+wQG3p/gaX3iKEtxQMvGod6tgKMpWE5TIfEKaLyMwX0AduQjP46OfDp4EezYwpQf7MENh0PVxLK9jM8S4008lqFdO1B/qs84+mvO/ZfUkH7xQ0I3fxlf8yyTW3gpuumOcSdbykal491o058cM3lk15CR/Ja2n6ovazemugBvpMRNcnvfpetamspB3e5YguXxyhdvAy6oJRLyZznqhD/pTg80OBtiFw/2r8vGKxgsRFkSJwo3YVHXtrUQZeeo+rYunshwemtkR7hoGyUleVVOISezFXjOBcuVwSaIwzXPi1J5CLJ3rg2QEepQSzbvPuuH4zt+apVmFKKv3Qpww4ugNs4c7NGxC6WVI7NPXBz8LJel4ku9OiDsxIHyES3XPuZ3fzFh8KC3TMRId/GaGqETBNMyzgtv+2x5vC5I9uEsFFjGEuHZUFT1ozdWXmRxDQoeCKxaBajF3vkALLdG5rcl8DyOl2eWKEWeJAj9IA39d653MeAutlzeCncvSfLeNHCxguPasUa4bD5Mop2v6O6vfpYER2a7USIUXXVCRegZBrEd1IiO3dwo/cn2W0abjeYMTT+OZYfsnCnNWUrOu1WbUJ21CtCCxrGbBUQFKl9dPr3GSQdR0nIVKByKPlpyuZBbVX6/hcXbDrhWB1q+OnZbiKoO1CZk5yG2OpZsVWfG6qlCFODEcXQrX+UXLPFsj+PQxI7w1Zev8CYCJy6Hlm6Edh0X5hzK8ARjOQSpj7jjuQWvfi2FiNqGGrCECOMyyjLLvHnDphrwKQKwVK20D4pjX7jlLI8k4C8rYXbhdenQjqlpFsppfc11X3g4gSXry4W8WtWT8zAeSuJlCh28yu0BdcbMwROqY7dAEhkTv12ww6c7p/ZeD4h2+IAXWJ6RMdI7ofxeHx7GeIa2TOrvfNa94a2EZW6dzifgSdnyzFIWfK7C7cYvT0kFm43/4ZK7TdzploHUcL5MNxvSNQ6ullGxdK08B5vNh6std1AMcu36R3NoLgDwNt4yf6H7Sw1/aKy7dpzMeBAV4YYHqd7pOP8L1r5U+rxZ3MAT1cSOkpVTIl2Lh6AlLfmffFlYHrzAzLRMoyn/bUfrcApsbBc3M/7XlueFv97GpBQ4QUAtT0uULtfBdskL6VfTVZGsaukuT6IP3tLvqKsmtl2lfOZJ1CKWoUef2j669NsgUqDesZzVSn95EhEM1RKUtu6K4F2ba/C8aJmDKD8MjGcDzGZLvTJLlu9pkPIsX4Z5bpwpxBkDy7N7WfIZRMXnS5CHeZqExs0EwDcJwDIdV30FG6+pteshdkGm/L4xbi8cXCx12JyL4+CbVOgsfBWE2SpLUq0nkVPLBU7OiyKMX42Dk3gtbLnvVl+hw9M63hqrPK9YUJd3JRiUJ/QZsxsHefgaB8XWaEasB4E6NiTyVVXiamw3sey+EY+7GU9Qlgex8ihM0+CVm4l/vK0Fyz2nOuocvPK4eA+1XR2KIZZNV33hFPcO1sAsZd165EArIMduASR9+GJz7v+5TalQjtrK8vgl8ila7ZNnlF98KNayC4qg2Brn/TDfvCop51XEszy7m39uXgwBDC+twPKgfREY4xbnucHypLkQM81dK8ZieZWuEDvzLNC3CDibBZYZKHHMUuRbxL21KMwLg7j4MKPl2XDlUfgysrT48KaliFHTnhg+w8SgCnOWh+mlu6X8sr0We7SreXYDS7oyOhKffgTLmz3l6cyk1pk45w6WiyHpjGA7vnEElstU6av4TI15FG/CLLffxjevcVTEhzwtD6ZLbx9BtDV0LDzBW27maicQNcW4gw8q/qGGsswEypPYa0NA1FSJTm6oew8o0ljO1Ttv6yzZtN8ywOy3zHJV3oVz8qIBCj+eZfj5FoorwXpg1LaWdgPT1PvwNVawvBn7LYgiXWHBK8YOLnziuA8+vHaEK4oeaA1meZ7mG3/JQyNBjHUQsNQpxGpilQUCoh7ucYA47OmP80EapjwKYz748vzHv//+P8I32Eo="; \ No newline at end of file +window.searchData = "eJy1nWtz27bSx7+L/dbTaqF73im23PjUiX18SZ9OpsOhJchmTZEsSTn16fS7PwOAlBbgklpKzKt2Yu5iCfxx2x9A/XOSxt+zkw/f/jl5DaLlyQcQk7OTyF/Lkw8n93HoR/7sWUb5r0F+cnayScOTDyeL0M8ymf1s//mnl3wdnpyVfz35cHLy71npdQhi63URR1mebhZ5nHJcntrPI/dnJ4mfyiivRrorGHpigEuO5CIP4ohb8O7xY8r97oehZNXf6fbR48vz/OUylVnWolxkcmQ9r4Jnbh2bR1uWJ3qDnU5T+ddGZvmlv1nI/HITLXnvXJittNmqMDsmjqVMwvj9IX6VPIGZ5/Pi+eNLPo/DsIW+jdECGx0Tw7PMP/qhHy0kq/RnmT9tH++m3Jv8RfLGlF3hcWFzTATrIMq/XD6wSlbPRqsDerhVYp76UbZivix6+Lhe9hxkuUwv4rUf8BRWmixLk+PKz+LwTd7HYasItFEWh53E8Czz2zRY++l7ixieZZ4Yo05iyFN/yeti5ZPHlBYG6yC/SZdMrenH4+LxY8p98vPFC79c/XgX5S7UoBDOwlCXzZtIjI0fhnFpc0wE34P8ZZn632dhyJu6i+f9MDyy5DiR0a1Mkwelm+s44k3hyiqRaaLVFhqrzqK4f4lT3srJCiMrzI5SQhhn8oBAtN0PjITdMHYgHbRMKKPlLMtkzusW6nG/fPzIUffh9p471uZJF+WpRdmFn/sf32ctltGqeGW59HP/6f3g1XRDNA/B4pW/yEHB5KXhMbGsZL540dHcpgFzoadtdCBJYXOUBv1NtHi53ayTy03EX2obs2SzTlabqIsVd5b7r7z3L588cu3DLm/37FHvJ6PlebxOlIDlchakyzROeO8ro+Via+lvLY+aE9KFf65HwTgL2BscZWUGwZ3V0VGk0s/l+fXnz/wQtMkiXK87K/8+iJ5DeR8s5fI6+GsTLIP8/TaOeQuGXUyZdpMpN2HpJjFujo3zUvX6srV4g6cy04NFgsyOjeMmkdG5jHKZymUZzm9B/rKtNnZoaoGxKDyVEaq1V4g8dREtatvWalcxokbtSPfFJmoWFjsvbnpFW/lhsfXqYB68+R7JZcswnmUeK7PO4yiCuIzTh+uLVqEUcaziNA+Xx0ezq5CH6wt2pezqIw+PznyZKO6K7f4hbeSHYbo177KtPvtBtAun3bZdPbuLpZsshv++DDZrM4zP1uuvA15nMmZm2PbX67dBl3Gcm7mpZRgdzGh2FMlBUSTHz6uJjJ7i+NWE8dlPX5nZ+tLQRLIuDY/KJfpRsJJZ3jqW0rDDWFS26z1/0Uv9SymXV+xhLnnPX/RqfyXlMuhgjNvG0TqCY/feujp/CZ6+x+nrg5+98rbe2urZWOXG6qh+Ei9eb/1EpveLIMtiZl5KWSXKKttZHV8XD0ESBlGbesi3FkflPWWUxel1kLFz7cYiDLIuMu7a17nO9KkYAmYSxtiZDGG4tTs6GzRfJ7khTbPFIt5EzJSMtpXKVu+B/Z1tN1mBO5nEaX6/Watsd8vsQKpts61tNxFdyNwPQrk0kbUMaVkYp6XxUTGFfvaiFvgP7AS+NlGTTBeZfO1Mb6JbBqBF00UELzIMNtmtn+oQosxf8DeHxjZRtrlte/y61eQ0n97Vsp6dWvPD0C/s4sLu+LG1f+2rtEsrjFtYhr5Ku3TEclE0X1bMtPcujONHW5VDUhJZlNv12zSIU+5uXVnnpbXaoic76+Nr5f6vjb/MPm/CPMi4pxxMtkUbrneGRxJ/tbl/iFsFUljlcUdRlGj5Mo3XrQIpDVdpvO4oFlPJZRS3aZzEmc/LiBVr5sI02ZkeE4+fJGn8dlhAhW3HEaXyT7nIDwrImHYcj/xbLja7JkNzAiumwrwMKrfMj4nL7L1+k08vcdxmnft9a3HknNSm6GeZd1PuUoay3Vsbi25KNzV4kQar/DGTabGqbVH5S2W6yWTqb007iuervwlbR/JWGHUwxl9FedwykMIyiPK462ge4oMaaTvzdNxOS5kGb6id2tBaY7uroG547TKWmaqdT34RV6tqimWmKufFLwLrqJacJruKVjEvHqe1AmN43Cykj13+tj22ohYPLfVd+NgdfVHriM6Urvc6j4qjXMhQPqsu3TI+7WGjPCxLDz8iOuVSnQtpozAUmjJX50O60dgmWbYfMY1RZ3XzLPNdAGyRP8t8F0EHCi9luRV2m/YpjbeK7qZ1KjHx26gSURct5aql7GkHqWa5M24Z02jg7u70kw9xHO7mkNXGbCWznyvPNN56qDj/KlN1uPCq2b31VGMB/d2titn5w9XNl90hqTc/DfynUGY/F39pdGQd3/9tdn09f/BmFxd38/t7z9jvcXzqefl7Iu1rBN6e1XjpwNjWhXMxv72++d17uPl1/qVVMOZ8u6czed2E8nF2PftyPm8VRXHOvJsAHu5mX+4v53etIij32p02x/nN9fVcGxzSJrtEVTdBfb768uB9uXxoFYs6iu9Fq7yzprlopww9E3dT+N38v4/z+wfv8vHLRbseW6ykPH3/patg7m+uv869i5vPs6t28ijOjHgGtXcTzi/zh2LwuJg9zFqF8yzzYvhQZyg7DOe2XSPpOJKOmudy/nD+ybu9u2o5kGks4mmm2k0g9w+zX+feb1cPn7z/PN62ikWfcPTUwsT7c5N0Hs79zfXs95ajLAopi0P/vavx9m7+y9X9w/zusO5kTtR02p+u518uvNn9/bzdaKtOg3uamHQTxvndfPYw9365+vjbzd2v3sPs/tdW8Zi1llcwek9B+m6Hv/ub62OGwCwOO222298fPnmH9n11msLrfABQQ+HNb1/mF0U93XuXN3few/VF68FRH6srqivzVnHq5eGyuyBv764+z+5+P6Q5VXTF7a/OZ7XZ9fW25h6uW078KjA/DLeVpk4Bdt2sOMDDmhRH2OWwcfV59ku7LlCMF8Haf+5Q/kZPqJoOlJgRFqqsH6G1cio6smVVmLuznt038d3s94urx89e0dTnt58/txuBzfFCr2hxdcDwhwQ2+/zZ+zo4JjR/vfbeBp12jJu785l3f/Xll+u5d391Mb/wfvt0dXd9e3NzfUh3UUefPHMi3dNH0r3vL0EaqksGHa1GZo9f1JT2+Pn28vHLAVkCczPIK64GdZktuLye3X/ybm7nX7z2m0N98sZTZ3+8DveJJqTz65v7+cEx6eNAXQZVKO/z4/XD1f3VL4fIrGTAnaU4bu6v1K7xsKAK1uXlcceBbdM/l3c3nw+LbZsMUtncjsNzG/L27ub25n520MCxjaw8a9BNiLPb27ubr8fGWBzP+FFB3s3/Mz9/ODJGc2LjR4U4/7/5+ePRbV2c4PhRQRZ6/G3+8dPNzUG7w+JsQ1fDyvX8wHDMSYtuw9GrOrWNv/c+/q4X7O0SHnopp09Aek/verneUcZDBXZIJamAOq2h29mdmSe/3M/ap7r1WVUPnUrqKE2l0i84Jp2xur27urm7evi9XcpKpWRwgDp7VR6W7LQPXtxdXT54X2eP1+2yRkU/1KjP06yvm7Aeby+OCcsAyO7DKlceV18ebg4Orlx+qNM/3YdYogYlu4u72W+za7MaOTTaEkDsznKYpUnngZcBHxduGeYPCtIsytVM8cvsQSXGDgzTLM+3h09+gFJRYFdfLm/aKRRFo85b/ICh5vFeT2fnN49fjhhx1MknrziA0WkD6xhv53e3B8VYtK4OUR3g6TbEi5v5vam/T7OvZayHhKkOs5kqVMfZini7DXW3Uzuy2dGe7Uc1/XYAurnzPt7c3d1YQ9EhQW8Hozj1nuI0ja1hqduarlbvgd3eqtjuev/F/O7qqzOjH3CCxZwJtcfLLk+zEAuPcrQ/dgVSjvYHByqGo91gan/DM1DfvVj5C5n9bP7CP06kEmCzK292e+X9Ov99j0d9pdoPPD8JvFdZf2GnCK+myP883l4pZHo3v5zf3elNqZbsvsL/3CSBwqWpXMk01dvQ5rN3vDAu53PvI/qA1Z7SV1J6Tw0fsWou1KT4bu+uvl5dz3+Z7yvU5PSSNHgLQvlcf4KuudBP8+urx3tuG5u7fO3b2NKnmqbRF4RxUeZPfIW6H8qt8XW673x4GVNNMYk61xfl/rPcW5L1KLcwu/uWB6xuEvuSpdUmzkP8KtP/Ybs8LR6va2c31ppCN2nQokzz9JFFpvG7H+bvH/0syG7jAN+z3h9BYfykjJPS+MiAFqbZ24SBTNoXTovqQh/jW0t0ppmMY/ccX1q7s4HuXQ5OEac7873dlXqdmqCy4Dny8026R/RuMNjsoCBw9X8Oonz3+JfLhzuZJXGUkTHVPsxvCHU+sr3r08KMft36d6gLQua+Onx3SCA708ODwQ2AvzrYMKwSj/ErXd1pySU5r9X5Pd3Z0O9JxV1XvFpDpv66Xfk7o6MD+C6fsiAnJV1b/s7m6OKDKMgDP9x+He7+5rpVKIX99ptwWcPH9FqElYVBkvjP8mPSSnGnpV3TcrJFGGVq+FK2a6DSbiUPbSS3G6420bUG901jIPkgvys2jvn1vhmDPv0GLYfhhggah+B2hRdj6CO99GqKobBsWoa1CkWmKb3ebwiitDmseCy6600YF9e4zCdlsibl1T/dYiaIcz/86oebQ0o41dZvhTX9+g2vVDs6qiNbWT7300guDwmr9CBLD12Flko/zIO1nCXvh8RVmvtJ/X60fVCZzNUHn8gxe19EyPaIcLCE/2PyC9uPSVNRuc90sokmne7dTVfCbbkVpUtt3Ilyi8ze10/oY7t7C90+f1yxS7kI1n7Yoo6RxXFF5z6tYrrY4unjigzj5/jx7opfqjJomm3Y1ewH4bv3FoebNsJyrI4LYZVK+T/p+Zv8xf7s0d4wCMvjQtG35A4IpGJ3XBiJTNd+JKNdmpsfCml7XDjyb/Vhv7odIB2GZdO6eDySm49rq4sYTYuQ6lMt1r65n2/Id6vxerq1oN+MCLl23fMqoytydVFXtjZp+Mwov3B9u+Uqery/OG8TgDYLok22XHQQxFpmWU2WuC6AncmxhS/iZauSi+cPKNba073nLzxV0092oewGz/vUXRN+k8Lva9cQTXFo0z3LiXbBJMTXfZnBcL7we0AwB4XRUQANXa8phH3dr10QdV2wKYLGbri3eNwVi28dm4+gqS8eq0+n1nTGume76I6Nvvd1yNqXqF3fZq/0nNMchrJrUH/bMBpTTnsqZG/WiREM1sFMZ8Xnf/vrJCTjsR7gt3gQJRsyoVX1d1o+W3OQwYqwprh4k/PL2z58RIHy70R9Hsb6jGFzqbZFu6JFbzqG4e47MJ/8aBkifqDP+f5c/GtjI1Xbvj7840Ex8tO8Jy9Cqe0w6yCU5PiBS9g9dkghS5kt0iBhVMmp/eghhUnTxHtfCT13UMUtXuSaTAFZ9VY+dUgRL44Ua8rYPcYsBAtV75TOX+TilSpm99c2aVf962ZxHQVzfJ4Wv2wWNwIwFGZTsQ/qPBa3zNw8fGiBaZC9kiJzCysfPLSgbBHT85lbUPlgi4LcLQT6qYqrXNIUs/pYi7mLXCLUuTzdsy52o63LrOZ5GjxtcnpMqC3cMjskCLJy91Zruwp9CiL8SwGNDk+3D+95m6bK1LdymltxV+D24XYF4orTPyN766f+mmw99Gd+pf218aO8JhnnOjxFD9NvgSOsnWXpDUmlsOLBgwuq3f9VSmre9NFF4Xb5uP194VtfHZ4gZ/bKQ23gMV1ltMvmiqvG2oQM/9ugjprStd1eobDD0G1z50f0PromBm2UFkZHBpAl/gL/QAuj/rcWRxYdbdZPMr1ZOT8fvT8CYxiv9vyGNDuQIFoGb8Fyc5AgdsZHqcLKWauDxvqXR+pHQ/eZlqs2tsvT5l+ArYTaso/TZTZ2cW6R6nSjn8vUDx8zOkVOlr0z22QNaXJmEKF8k2ldgposH1m0Lroiot1v2OxRkvtgV3Ii/XI0VYn8EGHRpe9XV0PhuIo/6cP5xc8ANCXiyQf5VVzc1H68Iw/Y1Ts/LQyVSd370u/QHAid/t4fR8Maf18YtdV+tWRX/O7RFlWvv9Lb1vXp1ozxtugNjm//SiAtFbA/GHQJXu3BySGlMSTkIC8cdBJYcQGpOAl/QGCFAx856LL56jIWnPZrTGDsD8fanu4Opjayw+pj/F7zZxZHabJo4/d0Z1OzgyTibpd6qCu5KfXAL3Qt85e4XcFbk6MLT2pn99rCtyaHFI4+174KoqWTA999pX33x0bxIHfFd25qPVp/5zpVv12HoQD1QfnKM5TzP87UZkH+ffLhn5M3maoTKicfTsRP/Z+mJ2cnq0Cq34f+8K1M5S/idXHxZxkvNvp//yge+yoX+qLRh2/m6Z97J2ffemdD8VN/NPjjj7NvpbH+g/6H0sfuX7QhnJx9A8oQKoZgGYqTs2+CMhQVQ2EZ9k/OvvXPBuOfxHBkGfYrhn3LcHBy9m1AlTioGA4sw+HJ2bchVeKwYji0DEcnZ99GVImjiuHIMhyfnH0bU4bjiuHYMpycnH2bUIaTiuHEMpyenH2bUobTiuHUFoDSA5Dagap4wFGPlg+tH0JAtoJA6QJIDUFVRGCrCJQ2oE8aV4UEtpJA6QNILUFVTGCrCZRGYEgaVwUFtqJA6QRITUFVVGCrCpRWgNQVVIUFtrJA6QVIbUFVXGCrC5RmgNQXVAUGtsKE0owgFSaqChO2woTSjCAVJqoKE84YpQcpepQihilbYUJpRpAKE1WFCVthQmlGkAoTVYUJW2FCaUaQChNVhQlbYUJpRpAKE1WFCVthQmlGkAoTVYUJW2FCaUaQChNVhQlbYUJpRpAKE1WFCVthfaWZPqmwflVhfVthfaWZPqmwflVhfVthfaWZPqmwflVhfWcm1FMhqbA+MRnaCusrzfRJhfWrCuvbCusrzfRJhfWrCuvbCusrzfRJhfWrCuvbCusrzfRJhfWrCuvbCusrzfRJhfWrCuvbCusrzfRJhfWrCuvbChsozQxIhQ2qChvYChsozQxIhQ2qChvYChsozQxIhQ2qChvYChsozQxIhQ2qChs46y294KJXXMSSy1bYQGlmQCpsUFXYwFbYQGlmQCpsUFXYwFbYQGlmQCpsUFXYwFbYQGlmQCpsUFXYwFbYQGlmQCpsUFXYwFbYUGlmSCpsWFXY0FbYUGlmSCpsWFXY0FbYUGlmSCpsWFXY0FbYUGlmSCpsWFXY0FbYUGlmSCpsWFXY0FnV62U9qbAhsbC3FTZUmhmSChtWFTa0FTZUmhmSChtWFTa0FTZUmhmSChtWFTa0FTZUmhmSChtWFTa0FTZSmhmRChtVFTayFTZSmhmRChtVFTayFTZSmhmRChtVFTayFTZSmhmRChtVFTayFTZSmhmRChtVFTayFTZSmhmRChtVFTZy9o5680jvHonto62wkdLMiFTYqKqwka2wkdLMiFTYqKqwka2wkdLMiFTYqKqwka2wsdLMmFTYuKqwsa2wsdLMmFTYuKqwsa2wsdLMmFTYuKqwsa2wsdLMmFTYuKqwsa2wsdLMmFTYuKqwsa2wsdLMmFTYuKqwsa2wsdLMmFTYuKqwsZOh0CkKOkdBJClshY2VZsakwsZVhY1thY2VZsakwsZVhY1thU2UZiakwiZVhU1shU2UZiakwiZVhU1shU2UZiakwiZVhU1shU2UZiakwiZVhU1shU2UZiakwiZVhU1shU2UZiakwiZVhU1shU2UZiakwiZVhU1shU2UZiakwiZVhU2cPJhOhNGZMCIVZitsojQzIRU2qSpsYitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSpsaitsqjQzJRU2rSps6mRbdbqVzrcSCVc342pSrjU5Vyrp6mRdezrt2qPzrj0i8dpzMq89nXrt0bnXHpF87TnZ155Ov/bo/GuPSMD2nAxsT6dge3QOtkckYXtOFran07A9Og/bIxKxPScT29Op2B6di+0Rydiek43t6XRsj87H9oiEbM/JyPZ0SrZH52R7RFK252Rlezot26Pzsj0iMdtzlGiS/zXZfyr9X8n/GwBQQwAoBOAo0UCAGgpAYQCXAxgQUEMCKBTgsgADA2poAIUDXB5ggEANEaCQgMsEDBSooQIUFnC5gAEDNWSAQgMuGzBwoIYOUHjA5QMGENQQAgoROIwAdNofaEoABCYAhxOATv0DTQqAQAXgsAIQBkfV8CgKSDlK1AgAaGIABDIAhxmAxgBAUwMgsAE43AA0CgCaHACBDsBhB6BxAND0AAh8AA4/AI0EgCYIQCAEcBgCaCwANEUAAiOAwxFAowGgSQIQKAEclgAaDwBNE4DACeDwBNCIAGiiAARSAIcpgMYEQFMFILACOFwB+gaO1tBRCo86StS4AGi6AAReAIcvgEYGQBMGIBADOIwBNDYAmjIAgRnA4Qyg0QHQpAEI1AAOawCND4CmDUDgBnB4A2iEADRxAAI5gMMcQGMEoKkDENgBHO4AGiUATR6AQA/gsAfQOAFo+gAEfgCHP4BGCkATCCAQBDgMAgYG1dewegrWO0rUaAFoEgEEigCHRYDGC0DTCCBwBDg8AjRiAJpIAIEkwGESoDED0FQCCCwBDpcAjRqAJhNAoAlw2ARo3AA0nQACT4DDJ0AjB6AJBRCIAhxGARo7AE0pgMAU4HAK0OgBaFIBBKoAh1WAxg9A0wogcAU4vAKG5uBIzckR6uiIo0QDLaiDTEBAC3CoBWgQATT0AAJcgEMuQMMIoMEHEPACHHoBGkgADT+AABjgEAwYGR3SQiYgBjgUAzSYABqCAAEywCEZoOEE0CAECJgBDs0ADShgJMhmJIAGOEQDNKQAGogAATXAoRqgQQXQUAQIsAEO2YCROcQ0PBv0f5pMwXFAHWNylKiBBdBwBAjAAQ7hAA0tgAYkQEAOcCgHaHABNCQBAnSAQzpAwwugQQkQsAMc2gEaYAANS4AAHuAQD9AQA8ZAtgIBPcChHqBBBtDQBAjwAQ75AA0zYEwe5gQCfoBDP0ADDaDhCRAABBwCAhpqAA1QgIAg4FAQGJsjdbQSCRACDgkBDTeABilAwBBwaAhowAE0TAECiIBDREBDDqCBChBQBBwqAhp0AA1VgAAj4JAR0LADaLACBBwBh46ABh5AwxUgAAk4hAQmg4a+QEAScCgJTIYNUiZACTikBDT8ABrxAAFLwKEloAEI0JgHCGACDjGBiTngSfcFApqAQ01AgxCgcQ8Q4AQccgIahgCNfICAJ+DQE5gaJdJ9gQAo4BAUmBol1hxUJZToUBTQYARo/AMESAGHpMB00DC9EzAFHJoC02HD5EoAFXCICmhIAjSEAgKqgENVQIMSoEEUEGAFHLICGpYADaOAgCvg0BWYmuPGdF8gAAs4hEUYwkJDKUEQFuEQFmEICw2mBEFYhENYhCEsNJwSBGERDmERhrDQgEoQhEU4hEUYwkJDKkEQFuEQFqGBiaAxlSAIi3AIi9DARPTIUVkQhEU4hEVoYCJoTCUIwiIcwiI0MBE0phIEYREOYREamIjegOrOgiAswiEsAszhd3LXJgjCIhzCIjQwETSmEgRhEQ5hERqY1LUCQViEQ1iEBiaC5lyCICzCISxCAxNBcy5BEBbhEBYBRolTuhIJJTqERcCooRkJwiIcwiJg3NSMhBIdwiI0MBE0aRMEYREOYREwbWpGQonuLQxzDYNGdYK6iOHexDCEhV5kCeoyRuU2hlYizfoEeSHDUaK5kkGzPkFdynBvZZhrGTTrE9TFDPdmhrmaQbM+QV3OcG9nmOsZMCKFRF3QcG9omCsaNOsT1CUN95aGISz0AkNQFzXcmxrmqgYNCwV1WcMhLKJvlEjPTARhEQ5hERqYiJorRQRhEQ5hEX1zMYjuCwRhEQ5hEf1+QzMShEU4hEVoYCJq7iYRhEU4hEVoYCLq7icRSnQIi9DARNTcUSIIi3AIi9DARNTcUyIIi3AIi9DARNTcVSIIi3AIi9DARNTcVyIIi3AIi9DARIgJ2YwEYREOYREDo0RaygRhEQ5hERqYCJo2CoKwCIewiIG5pkZLmSAswiEsQgMTQdNGQRAW4RAWoYGJoGmjIAiLcAiL0MBE0LRREIRFOIRFaGAi+sOzAfzUH08cB4QSHcIiBpOGBQZBWIRDWIQGJoLGlYIgLMIhLEIDk7pXIAiLcAiL0MBE0LxTEIRFOIRFDI0S6WGdICzCISxiaJRI9wWCsAiHsIihuTRJ9wWCsAiHsAgNTATNOwVBWIRDWIRGJoLmnYJgLMJhLEIjEzEg80iCYCzCYSxCI5NaHRBKdBiL0MhE0MBUEIxFOIxFaGQiaGAqCMYiHMYiNDIRNDAVBGMRDmMRGpnUVSLBWITDWMSo31CJBGMRDmMRI6NEujMRjEU4jEWMjBLpiYVgLMJhLGJklEh3JoKxCIexCI1MBI1sBcFYhMNYhEYmNW1A6NAhLGI0baoBQocOYREamAgaGQuCsAiHsAgNTASNjAVBWIRDWIQGJoJGxoIgLMIhLEIDE0EjY0EQFuEQFqGBiaCRsSAIi3AIixgPGxY4BGERDmERGpgIGhoLgrAIh7CIsdFhzZ1y6lK5o0MNTAQNjQVBWIRDWIQGJoKGxoIgLMIhLEIDE0FDY0EQlvLf9Pde3mSay+WV+e7Lt28n1e9E/XPiFZ+FEbvvy/9zouT44Z9//919CObDP/+ib8Gov6li/eJjN8gNjJEbMW7hRpa/QoC94aCEaOHNernpcOdmOuR5KX+5budFpda3bhQb15Yqi85ymCRp/Ca99SbMgyx49pI0TuLMD71qLaoDeLuS+sz3NgWU/kv32O8YuR0zvaIvTKOGEVPUMAOeWp780I8Wknjf6QS1z4TpLF+86O+oWhWHHEFbR0n5kWD0nv0Rfs8pz2PxCWvsBrCbPsvNQlVW6Idh+bVY9Jqo9oEX1EJ9GVKuk/xdf8OyGAosr0NUeUNe5WmviUyTXH1zMozV13XRaw/wWx/gMHuJ09yuSOSRWY36R3OQix4aDFTKW5uppCnPm/WRVfyu+GWHzEap/o49auRxD7Uyc0TeeVzufmreGsOwdMa9lk7jpDK2wmiAR0Xe6LqIo1VgaQU1yrAYWIcjrq9IVici1BpcN1mebtTHzazXQy/H86N/eqcf+tFyV2/Y4wi9Kre6dj6jldWeIzQ+jZj1pZ15yzRY5d4mk6lXDAbURDTAA+qAOSjgAt78TUh7xjXLnEEKz8/mR4489cNMlGu8alCXdlq4Dtb+MzVDgTXkcsdc43M74xNuBa5f0ap+eQsJXMv9VrUcpwvfy4LoOZSe+vLw0vv+EqRhEsdkSXiwB+5ob0oqvhVKxj/E8bfpLVp+St6Fuq11EKr1cZtK1061pC13SBvjNtIohKx0bI2FaJYbMmc57a9x7YeUwJ1MtNMs1j9cFcehvaZGQU7bBJn9tfGXWRmqNZihZhm1aZY8SMIgsusQTyhtdPMmU7XsCqovjATOXPMbj4W8rcZA0Y1bROfMTSPcu0ctBrrYWU/imlfnTTmO7B9DxotTvMDq8ZYYux+xxo7wOD7lLdDUr//uGVJGeEjhzZnGK9WQaLs75kaoFmbebnFABdnDaz92HWrHen1PbbJQqOzKVB7pZQxSDK+rGmfFF/RRDaIK5PqJsyD3giiP9y4y+niRwRulSv9b7/vWSEPcC4e8oRUV0rg8wKsOweyXxrWqHnq6miBtTdjSUj4LjzWz6gTVw6RVNeQxOR2gl+eOSTIN3pylp9lZkQ2HlyxD3pBuSthVLLFxm6Bha8IblK2fFMT5L5xm6TPbKpaZ0eyLv62LJvnioWbIL0MVoUrQBVByQH1vwux61f4WRKuYjBr3bOYiCcuizu9gjEcM5ojkdArl26oJpLMJT2YyTZ25HjtRB7BZXrZfDcepux7WFK+fFh8vZ+45cKR95vuaAoiE8hB3AebquvBWRot+uMGaeVCcY26Y6FdccT/FSx7BW9DJv3MZZZV0yhS/b48X1kr97rOnf12LXExgTfd40tEuze91bX9sASfRsIh6vBfWLvX8v5S5H4RymcrESfCNkN8RbyzauS1+Lw6FieuSJ52dNxNctlmvnWwuViQz0ad+ToDS9gRrm7eMWqnf+fF0ntTTSVJy3YBbnElhjOM4kVGDX7x2Fry1s/GbpMFbEMpne6uAqxK47a386ffXYVrqQTMvczvkeCt/XAIndjECGPHGS+1VVWU1RLRIauOsNjqc6GRmTFeplP+Tnr/JX/RPZdjjD37dHi/CZ5l7fhh6y3jtB1Hm5eGSXHBhOAjMjHvpO5XPQZbLVC6toiiR4vW4aPEGWSbzzHt69+LvkV6CVKc2/AJ9/guoWK2wzX/J6PFyTPC6hCpCxby3aiw+xgRkO+el41WcqiYmC8D5OuDNC6qAJA3UMNtQL4CHHuAJXXk22+Gln/vk1IjjZc5j2mtC1m8PB9njB9mUrsBN1mc3mcXU7SEDz7GCuQFUHsPQ9JCnd90/rFENLaVGvDWL8VhISg0Y2B/etzO37cbfbpTYObcco0AH7EALcm1lU1AypaWbOH9xqLWV7OF62+1BK/sNFNyEHZ2qq12lmf9YVYe6yoDdU/TIUdMWaJxmAqDSYeFtFad5aGFYPB0OeCuAZ5kXo0/1na3hjP3OyXv+UlmL4vM1Q35kpauVlMvAelWcdmJmnZ5lbtbffu4/vROpC7xuZC4bbZ95sHi1xY0JFxNwKZeJM2bhNRjXCZWvRY7GTEcG0hSkwc9e1cbA3Q/hLiyYE+uLHy1Dp7LwLCfMm56dqBscLIf69/Q8Pwm8V2mv6vCYD8x1p3Gnfx8d7aCtdhmhcXrUJsjtD2uSu0ucklKHQ1v7Jb3i1I5gzlJ2lxOWmAfl2REmwaF+cBmHh88IMZFVEAV54Idh8NcmWAb5exZbzA8wmQTmVB9EycY+dAP41A3z2I3+JT+Z5dJPI2lVorqlj7AOL6jtjyxileCkCzOB8+cmCXKZeispvSd7jAG8Gwfmxr70l8qVTFOdD6skQtVni5Bj3uBQON4OrfYeDfdmJnwN/U2kkkSbdbLaRLWUSH3CEe0/eDI0vgvXFcLTR9Eyc9ihjJZmP0ZuBfAGD3iDmfJolq+2hnCfYzoqf+Ya913sh5nHCIN1kFdPMGKt8Ea+MH6ON2lgKwTnYKc8LYebMC7kaxJ0GTWMqs98oDGFp+a1HwUrmeXFMQU/fZVWF8EDPhNBrGWWuc3Qw2fwetNieGZuFtcy9ys9DeeIgTnOl47cNsFARH2DhelL/9IqlixeIjDXMOvAGZLGOBYzdp6dqC/LcL3VZY/wHNvjLXO1u2hFdvUe7urMbJTyt2PW0SonZYzPQqvPS3E9Owfw7LGI5UU/bi3OcI8aFYs+mBbnIAVz1Rxt1k8yjVfV48LqXhsa5ngzpcpe+gG5mMQKVF/q47p7iuPXuhFggFYqzHPWymX92WO8muK1i+WvevTYuorAc5gufHOgWQN5W9qYkjEhmfan628RrteWM6Qg5im5nTNzxk8f8dsuJNUpP6sA1OTMMzOqAEORire3NIkzqcxEqnKo2mgh9dpyWfr9HuQv28CtMtCCjpk5K8tAdUI2HlJrn6lWc8WgksDv48U1M68Sb/LKGh1Pfczjl0Q0QysBwGsXvUP00BaRTGPinQizyrRje/LDF2MEM4GXqBN9Ue4sFgDvXYG5HUxkuvYjGeWeOhH27OfOyTe8Pezx5pQqtOxhagnlLMA8fF2TLFKfwEFOmW+rfAXRJlvaG68elmyvRVypHzkrNtxFBTMtlhS/8L6SzsIUT8XMgzfIF52JwN2KuUoo9kFmU0QvofHag3k2Bu+uqGsY+EgpMJeFKrvo7Tk8gAcW4ArnPX/Zd4AAr2KZCycnGRrkcm3P0Hjw4o4xpc+KN7xtFcxcMpnY6VvXoHgtk/rvy2Cz9ooT8v567b0NyO06HsWYuRnH+SJZr0nXWKXMJU/h2nj21+u3gbXIQ43eriLoZQ/O6DHPatn+EscfGo2Y420q/TAP1tJP7DXyBCeTpjx9l/CqiYLizA+TFZVuCbyBxcPUjvxTLnLmQTDLfRv/jRcZkFfmiJzKvzYyy73VJqIPJuAZDZgTd+lULT+Xqf/dD71VGq/3HknG4ylzBVMUtfI3C5nrl7CS8CgH38bdLnAVd81ZYTSrMLMDqboxog6e1ooYp2mAecSt9JrFYVP3wO3IVrT2XMMoUX8bcLub9pfFIdHhrMbnusv9V2vyxItg5uXwNMhenWOgOGXJ3IGl8eI18ROZZosgy5xLJHipxMwxpPG7H+bvT34WZEkcOPeR1UfW0QqdNx5nixe59u03xakAZn1lizi1FywWgmTuJjOVxsYbI9XlvHLNSY4OeHxnCk6VsojXif6ow9IP0mUaJ5ZeUK9gDsPKpwp8UW6wy6CtgQe1D5PSZTLPg+jZbueJdZ2d2UCBc60bp0CEWQycnYhhyegMdjk7EUxMmQXPkZ9vUidpiLcY5gsKKm1a5E8FM9GUBevAPZSDT2YJ5lnVLAySxH+WLsjCFzyAeRPD3PLzn2WUvwbWFICcMfWY+IvAycbh7b9gHtevjnuo9pkH17UP0+3+3CTkZIQXaszNLPKq6u2dPiyI9/HQYzZp7ucbWxk4BS565ZEAEOX/MB2/r58cODzFYp7ylg657/RdfA0UmN/uUIconPQETqML5qnHXKVgUn9t91CLnzHjkVGmEn/qexthkOWOeHFOjJntNh6VLwcX4NQ587RuhacKfDpODMuhjnngWbtbvMjFqz294cQaMx+tXbl5JuyHedegOLwfu40p7M998Jaf2llV7QJfghDMpaH2lb8nzkoA7+eZyfA8zmuOfeBEuGCe49Le3vxw46SVMJdhHvyrHFC3ztkyX67uugAWAzBpoHFWpleXe7dTOFxmTqEoQjtWwKfxAxh4EGeCKe1/oxDC9jVqdlcoeCYQRr6VSxU+dfcOiYp5VwwtU5XiHSyAh2fmV2O0w5VzusFKKbVyQ91oxodw2U1jvOmtetPVW5z+A+axldK7ck7daMVf9OHW4vdAfZXKnuOw5pmQZpMsOR9lwe3DzHkSnkvZkxc3rSO1vDHdFFHTh/BFdN5877qjWA7+9gBzS+Ke9xhZIymvmb77YWiDcbx3K2d63msaXx5xzBcfgj/AFdUV0bsyl5LbI6D22gZvFJhfNCo8VSZqfEdYML93V/japPbqAWeGxahkcsxb6d/lUxY4qBB/ggaY11rLhB0vz4j7GZMrbwuIU+8pTtPYKqrpDjkeN5gYb5d+dBZqeAHZytM2jUnMiPjIJPPMacVtZezBOyhOjv+Ps5MkSGQYRPLkw7c//v33/wFNDG76"; \ No newline at end of file diff --git a/docs/classes/SolanaAgentKit.html b/docs/classes/SolanaAgentKit.html index 84a3cfe..96303d4 100644 --- a/docs/classes/SolanaAgentKit.html +++ b/docs/classes/SolanaAgentKit.html @@ -1,7 +1,7 @@ SolanaAgentKit | solana-agent-kit

Class SolanaAgentKit

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

SolanaAgentKit

-

Constructors

Constructors

Properties

config connection wallet @@ -14,23 +14,34 @@ Provides a unified interface for token operations, NFT management, trading and m closePerpTradeShort create3LandCollection create3LandNft +createDriftUserAccount +createDriftVault createGibworkTask createMultisigProposal createSquadsMultisig createTiplink +CreateWebhook +deleteWebhook deployCollection deployToken +depositIntoDriftVault +depositToDriftUserAccount depositToMultisig +deriveDriftVaultAddress +doesUserHaveDriftAccount +driftUserAccountInfo executeMultisigTransaction fetchTokenDetailedReport fetchTokenPrice fetchTokenReportSummary flashCloseTrade flashOpenTrade +getAllAssetsbyOwner getAllDomainsTLDs getAllRegisteredAllDomains getBalance getBalanceOther +getDriftVaultInfo getMainAllDomainsDomain getOwnedAllDomains getOwnedDomainsForTLD @@ -40,6 +51,8 @@ Provides a unified interface for token operations, NFT management, trading and m getTokenDataByAddress getTokenDataByTicker getTPS +getWebhook +heliusParseTransactions launchPumpFunToken lendAssets limitOrder @@ -60,31 +73,39 @@ Provides a unified interface for token operations, NFT management, trading and m registerDomain rejectMultisigProposal requestFaucetFunds +requestWithdrawalFromDriftVault resolveAllDomains resolveSolDomain restake rockPaperScissors sendCompressedAirdrop +sendTranctionWithPriority stake tensorCancelListing tensorListNFT trade +tradeUsingDelegatedDriftVault +tradeUsingDriftPerpAccount transfer transferFromMultisig +updateDriftVault +updateDriftVaultDelegate withdrawAll +withdrawFromDriftAccount +withdrawFromDriftVault

Constructors

  • Parameters

    • private_key: string
    • rpc_url: string
    • openai_api_key: null | string

    Returns SolanaAgentKit

    Using openai_api_key directly in constructor is deprecated. Please use the new constructor with Config object instead:

    const agent = new SolanaAgentKit(privateKey, rpcUrl, {
    OPENAI_API_KEY: 'your-key'
    });
    -
  • Parameters

    • private_key: string
    • rpc_url: string
    • config: Config

    Returns SolanaAgentKit

Properties

config: Config

Configuration object

-
connection: Connection

Solana RPC connection

-
wallet: Keypair

Wallet keypair for signing transactions

-
wallet_address: PublicKey

Public key of the wallet

-

Methods

  • Parameters

    • OptionaltransactionIndex: number | bigint

    Returns Promise<string>

  • Parameters

    • marketId: PublicKey

    Returns Promise<string>

  • Returns Promise<{ signature: string; size: number }>

  • Parameters

    • args: Omit<{ agent: SolanaAgentKit; price: number; tradeMint: PublicKey }, "agent">

    Returns Promise<string>

  • Parameters

    • args: Omit<{ agent: SolanaAgentKit; price: number; tradeMint: PublicKey }, "agent">

    Returns Promise<string>

  • Parameters

    • optionsWithBase58: StoreInitOptions
    • collectionOpts: CreateCollectionOptions

    Returns Promise<string>

  • Parameters

    • optionsWithBase58: StoreInitOptions
    • collectionAccount: string
    • createItemOptions: CreateSingleOptions
    • isMainnet: boolean

    Returns Promise<string>

  • Parameters

    • title: string
    • content: string
    • requirements: string
    • tags: string[]
    • tokenMintAddress: string
    • tokenAmount: number
    • Optionalpayer: string

    Returns Promise<GibworkCreateTaskReponse>

  • Parameters

    • OptionaltransactionIndex: number | bigint

    Returns Promise<string>

  • Parameters

    • creator: PublicKey

    Returns Promise<string>

  • Parameters

    • amount: number
    • OptionalsplmintAddress: PublicKey

    Returns Promise<{ signature: string; url: string }>

  • Parameters

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

    Returns Promise<{ mint: PublicKey }>

  • Parameters

    • amount: number
    • vaultIndex: number = 0
    • Optionalmint: PublicKey

    Returns Promise<string>

  • Parameters

    • OptionaltransactionIndex: number | bigint

    Returns Promise<string>

  • Parameters

    • mint: string

    Returns Promise<string>

  • Closes an existing trading position on Flash.Trade

    +
  • Parameters

    • private_key: string
    • rpc_url: string
    • config: Config

    Returns SolanaAgentKit

  • Properties

    config: Config

    Configuration object

    +
    connection: Connection

    Solana RPC connection

    +
    wallet: Keypair

    Wallet keypair for signing transactions

    +
    wallet_address: PublicKey

    Public key of the wallet

    +

    Methods

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

    • Returns Promise<{ signature: string; size: number }>

    • Parameters

      • args: Omit<{ agent: SolanaAgentKit; price: number; tradeMint: PublicKey }, "agent">

      Returns Promise<string>

    • Parameters

      • args: Omit<{ agent: SolanaAgentKit; price: number; tradeMint: PublicKey }, "agent">

      Returns Promise<string>

    • Parameters

      • optionsWithBase58: StoreInitOptions
      • collectionOpts: CreateCollectionOptions

      Returns Promise<string>

    • Parameters

      • optionsWithBase58: StoreInitOptions
      • collectionAccount: string
      • createItemOptions: CreateSingleOptions
      • isMainnet: boolean

      Returns Promise<string>

    • Parameters

      • depositAmount: number
      • depositSymbol: string

      Returns Promise<
          | { account: PublicKey; message?: undefined; txSignature: string }
          | { account: PublicKey; message: string; txSignature?: undefined },
      >

    • Parameters

      • params: {
            hurdleRate?: number;
            managementFee: number;
            marketName: `${string}-${string}`;
            maxTokens: number;
            minDepositAmount: number;
            name: string;
            permissioned?: boolean;
            profitShare: number;
            redeemPeriod: number;
        }

      Returns Promise<string>

    • Parameters

      • title: string
      • content: string
      • requirements: string
      • tags: string[]
      • tokenMintAddress: string
      • tokenAmount: number
      • Optionalpayer: string

      Returns Promise<GibworkCreateTaskReponse>

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • creator: PublicKey

      Returns Promise<string>

    • Parameters

      • amount: number
      • OptionalsplmintAddress: PublicKey

      Returns Promise<{ signature: string; url: string }>

    • Parameters

      • webhookID: string

      Returns Promise<any>

    • Parameters

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

      Returns Promise<{ mint: PublicKey }>

    • Parameters

      • amount: number
      • vault: string

      Returns Promise<string>

    • Parameters

      • amount: number
      • symbol: string
      • OptionalisRepayment: boolean

      Returns Promise<TxSigAndSlot>

    • Parameters

      • amount: number
      • vaultIndex: number = 0
      • Optionalmint: PublicKey

      Returns Promise<string>

    • Parameters

      • name: string

      Returns Promise<PublicKey>

    • Returns Promise<{ account: PublicKey; hasAccount: boolean }>

    • Returns Promise<
          {
              authority: PublicKey;
              cumulativePerpFunding: BN;
              cumulativeSpotFees: BN;
              delegate: PublicKey;
              hasOpenAuction: boolean;
              hasOpenOrder: boolean;
              idle: boolean;
              isMarginTradingEnabled: boolean;
              lastActiveSlot: number;
              lastAddPerpLpSharesTs: BN;
              lastFuelBonusUpdateTs: number;
              liquidationMarginFreed: BN;
              marginMode: MarginMode;
              maxMarginRatio: number;
              name: number[];
              nextLiquidationId: number;
              nextOrderId: number;
              openAuctions: number;
              openOrders: number;
              orders: Order[];
              perpPositions: {
                  baseAssetAmount: number;
                  lastBaseAssetAmountPerLp: BN;
                  lastCumulativeFundingRate: BN;
                  lastQuoteAssetAmountPerLp: BN;
                  lpShares: BN;
                  marketIndex: number;
                  openAsks: BN;
                  openBids: BN;
                  openOrders: number;
                  perLpBase: number;
                  quoteAssetAmount: BN;
                  quoteBreakEvenAmount: BN;
                  quoteEntryAmount: BN;
                  remainderBaseAssetAmount: number;
                  settledPnl: number;
              }[];
              poolId: number;
              settledPerpPnl: string;
              spotPositions: {
                  balanceType: SpotBalanceType;
                  cumulativeDeposits: number;
                  marketIndex: number;
                  openAsks: BN;
                  openBids: BN;
                  openOrders: number;
                  scaledBalance: number;
                  symbol: undefined
                  | string;
              }[];
              status: number;
              subAccountId: number;
              totalDeposits: string;
              totalSocialLoss: BN;
              totalWithdraws: string;
          },
      >

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • mint: string

      Returns Promise<string>

    • Opens a new trading position on Flash.Trade

      Parameters

      • params: FlashTradeParams

        Flash trade parameters including market, side, collateral, leverage, and pool name

      Returns Promise<string>

      Transaction signature

      -
    • Returns Promise<string[]>

    • Returns Promise<string[]>

    • Parameters

      • Optionaltoken_address: PublicKey

      Returns Promise<number>

    • Parameters

      • walletAddress: PublicKey
      • OptionaltokenAddress: PublicKey

      Returns Promise<number>

    • Parameters

      • owner: PublicKey

      Returns Promise<null | string>

    • Parameters

      • owner: PublicKey

      Returns Promise<string[]>

    • Parameters

      • tld: string

      Returns Promise<string[]>

    • Parameters

      • account: PublicKey

      Returns Promise<string>

    • Parameters

      • priceFeedID: string

      Returns Promise<string>

    • Parameters

      • tokenSymbol: string

      Returns Promise<string>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey
      • quantity: number
      • side: string
      • price: number

      Returns Promise<string>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<MintCollectionNFTResponse>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey
      • lotSize: number = 1
      • tickSize: number = 0.01

      Returns Promise<string[]>

    • Parameters

      • args: Omit<
            {
                agent: SolanaAgentKit;
                collateralAmount: number;
                collateralMint?: PublicKey;
                leverage?: number;
                price: number;
                slippage?: number;
                tradeMint?: PublicKey;
            },
            "agent",
        >

      Returns Promise<string>

    • Parameters

      • args: Omit<
            {
                agent: SolanaAgentKit;
                collateralAmount: number;
                collateralMint?: PublicKey;
                leverage?: number;
                price: number;
                slippage?: number;
                tradeMint?: PublicKey;
            },
            "agent",
        >

      Returns Promise<string>

    • Parameters

      • positionMintAddress: PublicKey

      Returns Promise<string>

    • Parameters

      • mintDeploy: PublicKey
      • mintPair: PublicKey
      • initialPrice: Decimal
      • feeTier: 1 | 2 | 4 | 5 | 16 | 30 | 65 | 100 | 200

      Returns Promise<string>

    • Parameters

      • depositTokenAmount: number
      • depositTokenMint: PublicKey
      • otherTokenMint: PublicKey
      • initialPrice: Decimal
      • maxPrice: Decimal
      • feeTier: 1 | 2 | 4 | 5 | 16 | 30 | 65 | 100 | 200

      Returns Promise<string>

    • Parameters

      • whirlpoolAddress: PublicKey
      • priceOffsetBps: number
      • inputTokenMint: PublicKey
      • inputAmount: Decimal

      Returns Promise<string>

    • Parameters

      • whirlpoolAddress: PublicKey
      • distanceFromCurrentPriceBps: number
      • widthBps: number
      • inputTokenMint: PublicKey
      • inputAmount: Decimal

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey
      • baseAmount: BN
      • quoteAmount: BN
      • startTime: BN

      Returns Promise<string>

    • Parameters

      • mint1: PublicKey
      • mint2: PublicKey
      • configId: PublicKey
      • initialPrice: Decimal
      • startTime: BN

      Returns Promise<string>

    • Parameters

      • mint1: PublicKey
      • mint2: PublicKey
      • configId: PublicKey
      • mintAAmount: BN
      • mintBAmount: BN
      • startTime: BN

      Returns Promise<string>

    • Parameters

      • name: string
      • OptionalspaceKB: number

      Returns Promise<string>

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • domain: string

      Returns Promise<undefined | PublicKey>

    • Parameters

      • domain: string

      Returns Promise<PublicKey>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • amount: number
      • choice: "rock" | "paper" | "scissors"

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey
      • price: 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>

    • Parameters

      • amount: number
      • to: PublicKey
      • vaultIndex: number = 0
      • Optionalmint: PublicKey

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

    +
    • Parameters

      • owner: PublicKey
      • limit: number

      Returns Promise<any>

    • Parameters

      • Optionaltoken_address: PublicKey

      Returns Promise<number>

    • Parameters

      • walletAddress: PublicKey
      • OptionaltokenAddress: PublicKey

      Returns Promise<number>

    • Parameters

      • vaultName: string

      Returns Promise<
          {
              address: string;
              balance: string;
              delegate: string;
              hurdleRate: number;
              managementFee: number;
              marketName: string;
              maxTokens: number;
              minDepositAmount: number;
              name: string;
              permissioned: boolean;
              profitShare: number;
              redeemPeriod: number;
          },
      >

    • Parameters

      • owner: PublicKey

      Returns Promise<null | string>

    • Parameters

      • owner: PublicKey

      Returns Promise<string[]>

    • Parameters

      • tld: string

      Returns Promise<string[]>

    • Parameters

      • account: PublicKey

      Returns Promise<string>

    • Parameters

      • priceFeedID: string

      Returns Promise<string>

    • Parameters

      • tokenSymbol: string

      Returns Promise<string>

    • Parameters

      • transactionId: string

      Returns Promise<any>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey
      • quantity: number
      • side: string
      • price: number

      Returns Promise<string>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<MintCollectionNFTResponse>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey
      • lotSize: number = 1
      • tickSize: number = 0.01

      Returns Promise<string[]>

    • Parameters

      • args: Omit<
            {
                agent: SolanaAgentKit;
                collateralAmount: number;
                collateralMint?: PublicKey;
                leverage?: number;
                price: number;
                slippage?: number;
                tradeMint?: PublicKey;
            },
            "agent",
        >

      Returns Promise<string>

    • Parameters

      • args: Omit<
            {
                agent: SolanaAgentKit;
                collateralAmount: number;
                collateralMint?: PublicKey;
                leverage?: number;
                price: number;
                slippage?: number;
                tradeMint?: PublicKey;
            },
            "agent",
        >

      Returns Promise<string>

    • Parameters

      • positionMintAddress: PublicKey

      Returns Promise<string>

    • Parameters

      • mintDeploy: PublicKey
      • mintPair: PublicKey
      • initialPrice: Decimal
      • feeTier: 1 | 2 | 4 | 5 | 16 | 30 | 65 | 100 | 200

      Returns Promise<string>

    • Parameters

      • depositTokenAmount: number
      • depositTokenMint: PublicKey
      • otherTokenMint: PublicKey
      • initialPrice: Decimal
      • maxPrice: Decimal
      • feeTier: 1 | 2 | 4 | 5 | 16 | 30 | 65 | 100 | 200

      Returns Promise<string>

    • Parameters

      • whirlpoolAddress: PublicKey
      • priceOffsetBps: number
      • inputTokenMint: PublicKey
      • inputAmount: Decimal

      Returns Promise<string>

    • Parameters

      • whirlpoolAddress: PublicKey
      • distanceFromCurrentPriceBps: number
      • widthBps: number
      • inputTokenMint: PublicKey
      • inputAmount: Decimal

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey
      • baseAmount: BN
      • quoteAmount: BN
      • startTime: BN

      Returns Promise<string>

    • Parameters

      • mint1: PublicKey
      • mint2: PublicKey
      • configId: PublicKey
      • initialPrice: Decimal
      • startTime: BN

      Returns Promise<string>

    • Parameters

      • mint1: PublicKey
      • mint2: PublicKey
      • configId: PublicKey
      • mintAAmount: BN
      • mintBAmount: BN
      • startTime: BN

      Returns Promise<string>

    • Parameters

      • name: string
      • OptionalspaceKB: number

      Returns Promise<string>

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • amount: number
      • vault: string

      Returns Promise<string>

    • Parameters

      • domain: string

      Returns Promise<undefined | PublicKey>

    • Parameters

      • domain: string

      Returns Promise<PublicKey>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • amount: number
      • choice: "rock" | "paper" | "scissors"

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

      • priorityLevel: string
      • amount: number
      • to: PublicKey
      • OptionalsplmintAddress: PublicKey

      Returns Promise<{ fee: number; transactionId: string }>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey
      • price: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • vault: string
      • amount: number
      • symbol: string
      • action: "long" | "short"
      • type: "market" | "limit"
      • Optionalprice: number

      Returns Promise<TxSigAndSlot>

    • Parameters

      • amount: number
      • symbol: string
      • action: "long" | "short"
      • type: "market" | "limit"
      • Optionalprice: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • amount: number
      • to: PublicKey
      • vaultIndex: number = 0
      • Optionalmint: PublicKey

      Returns Promise<string>

    • Parameters

      • vaultAddress: string
      • params: {
            hurdleRate?: number;
            managementFee: number;
            marketName: `${string}-${string}`;
            maxTokens: number;
            minDepositAmount: number;
            name: string;
            permissioned?: boolean;
            profitShare: number;
            redeemPeriod: number;
        }

      Returns Promise<string>

    • Parameters

      • vaultAddress: string
      • delegate: string

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

    • Parameters

      • amount: number
      • symbol: string
      • OptionalisBorrow: boolean

      Returns Promise<TxSigAndSlot>

    • Parameters

      • vault: string

      Returns Promise<string>

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

    Function createSolanaTools

    • Parameters

      Returns (
          | SolanaPerpOpenTradeTool
          | SolanaPerpCloseTradeTool
          | SolanaResolveAllDomainsTool
          | SolanaGetOwnedDomains
          | SolanaGetOwnedTldDomains
          | SolanaGetAllTlds
          | SolanaTokenDataByTickerTool
          | SolanaFlashOpenTrade
          | SolanaFlashCloseTrade
          | SolanaCreateGibworkTask
          | SolanaFetchPriceTool
          | SolanaTokenDataTool
          | SolanaTradeTool
          | SolanaStakeTool
          | SolanaLendAssetTool
          | SolanaManifestCreateMarket
          | SolanaBatchOrderTool
          | SolanaCancelAllOrdersTool
          | SolanaLimitOrderTool
          | SolanaWithdrawAllTool
          | SolanaTPSCalculatorTool
          | SolanaRequestFundsTool
          | SolanaBalanceTool
          | SolanaBalanceOtherTool
          | SolanaCloseEmptyTokenAccounts
          | SolanaTransferTool
          | SolanaCreateImageTool
          | SolanaGetWalletAddressTool
          | SolanaDeployCollectionTool
          | SolanaMintNFTTool
          | SolanaDeployTokenTool
          | SolanaOpenbookCreateMarket
          | SolanaOrcaCreateCLMM
          | SolanaOrcaCreateSingleSideLiquidityPool
          | SolanaClosePosition
          | SolanaOrcaFetchPositions
          | SolanaOrcaOpenCenteredPosition
          | SolanaOrcaOpenSingleSidedPosition
          | SolanaPumpfunTokenLaunchTool
          | SolanaPythFetchPrice
          | SolanaRaydiumCreateAmmV4
          | SolanaRaydiumCreateClmm
          | SolanaRaydiumCreateCpmm
          | SolanaFetchTokenReportSummaryTool
          | SolanaFetchTokenDetailedReportTool
          | SolanaRockPaperScissorsTool
          | SolanaRestakeTool
          | SolanaListNFTForSaleTool
          | SolanaCancelNFTListingTool
          | Solana3LandCreateSingle
          | Solana3LandCreateCollection
          | SolanaTipLinkTool
          | SolanaRegisterDomainTool
          | SolanaResolveDomainTool
          | SolanaGetDomainTool
          | SolanaGetMainDomain
          | SolanaCompressedAirdropTool
          | SolanaApproveProposal2by2Multisig
          | SolanaCreate2by2Multisig
          | SolanaCreateProposal2by2Multisig
          | SolanaDepositTo2by2Multisig
          | SolanaExecuteProposal2by2Multisig
          | SolanaRejectProposal2by2Multisig
          | SolanaTransferFrom2by2Multisig
      )[]

    +createSolanaTools | solana-agent-kit

    Function createSolanaTools

    • Parameters

      Returns (
          | SolanaPerpOpenTradeTool
          | SolanaPerpCloseTradeTool
          | SolanaResolveAllDomainsTool
          | SolanaGetOwnedDomains
          | SolanaGetOwnedTldDomains
          | SolanaGetAllTlds
          | SolanaTokenDataByTickerTool
          | SolanaFlashOpenTrade
          | SolanaFlashCloseTrade
          | SolanaCreateGibworkTask
          | SolanaFetchPriceTool
          | SolanaTokenDataTool
          | SolanaTradeTool
          | SolanaStakeTool
          | SolanaLendAssetTool
          | SolanaManifestCreateMarket
          | SolanaBatchOrderTool
          | SolanaCancelAllOrdersTool
          | SolanaLimitOrderTool
          | SolanaWithdrawAllTool
          | SolanaTPSCalculatorTool
          | SolanaRequestFundsTool
          | SolanaBalanceTool
          | SolanaBalanceOtherTool
          | SolanaCloseEmptyTokenAccounts
          | SolanaTransferTool
          | SolanaCreateImageTool
          | SolanaGetWalletAddressTool
          | SolanaDeployCollectionTool
          | SolanaMintNFTTool
          | SolanaDeployTokenTool
          | SolanaOpenbookCreateMarket
          | SolanaOrcaCreateCLMM
          | SolanaOrcaCreateSingleSideLiquidityPool
          | SolanaClosePosition
          | SolanaOrcaFetchPositions
          | SolanaOrcaOpenCenteredPosition
          | SolanaOrcaOpenSingleSidedPosition
          | SolanaPumpfunTokenLaunchTool
          | SolanaPythFetchPrice
          | SolanaRaydiumCreateAmmV4
          | SolanaRaydiumCreateClmm
          | SolanaRaydiumCreateCpmm
          | SolanaFetchTokenReportSummaryTool
          | SolanaFetchTokenDetailedReportTool
          | SolanaRockPaperScissorsTool
          | SolanaRestakeTool
          | SolanaListNFTForSaleTool
          | SolanaCancelNFTListingTool
          | Solana3LandCreateSingle
          | Solana3LandCreateCollection
          | SolanaTipLinkTool
          | SolanaRegisterDomainTool
          | SolanaResolveDomainTool
          | SolanaGetDomainTool
          | SolanaGetMainDomain
          | SolanaCompressedAirdropTool
          | SolanaApproveProposal2by2Multisig
          | SolanaCreate2by2Multisig
          | SolanaCreateProposal2by2Multisig
          | SolanaDepositTo2by2Multisig
          | SolanaExecuteProposal2by2Multisig
          | SolanaRejectProposal2by2Multisig
          | SolanaTransferFrom2by2Multisig
          | SolanaHeliusWebhookTool
          | SolanaDeleteHeliusWebhookTool
          | SolanaGetAllAssetsByOwner
          | SolanaGetHeliusWebhookTool
          | SolanaParseTransactionHeliusTool
          | SolanaSendTransactionWithPriorityFee
      )[]

    diff --git a/docs/functions/createVercelAITools.html b/docs/functions/createVercelAITools.html index 8e46ff9..73f2928 100644 --- a/docs/functions/createVercelAITools.html +++ b/docs/functions/createVercelAITools.html @@ -1 +1 @@ -createVercelAITools | solana-agent-kit

    Function createVercelAITools

    +createVercelAITools | solana-agent-kit

    Function createVercelAITools

    diff --git a/docs/functions/executeAction.html b/docs/functions/executeAction.html index a92edc3..91163d4 100644 --- a/docs/functions/executeAction.html +++ b/docs/functions/executeAction.html @@ -1,2 +1,2 @@ executeAction | solana-agent-kit

    Function executeAction

    • Execute an action with the given input

      -

      Parameters

      Returns Promise<Record<string, any>>

    +

    Parameters

    Returns Promise<Record<string, any>>

    diff --git a/docs/functions/findAction.html b/docs/functions/findAction.html index 8d68c1f..479f85c 100644 --- a/docs/functions/findAction.html +++ b/docs/functions/findAction.html @@ -1,2 +1,2 @@ findAction | solana-agent-kit

    Function findAction

    • Find an action by its name or one of its similes

      -

      Parameters

      • query: string

      Returns Action | undefined

    +

    Parameters

    • query: string

    Returns Action | undefined

    diff --git a/docs/functions/getActionExamples.html b/docs/functions/getActionExamples.html index b4b0757..48d9e28 100644 --- a/docs/functions/getActionExamples.html +++ b/docs/functions/getActionExamples.html @@ -1,2 +1,2 @@ getActionExamples | solana-agent-kit

    Function getActionExamples

    • Get examples for an action

      -

      Parameters

      • action: Action

      Returns string

    +

    Parameters

    • action: Action

    Returns string

    diff --git a/docs/index.html b/docs/index.html index b698fac..97f6b6b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -62,6 +62,7 @@
  • Pyth Price feeds for fetching Asset Prices
  • Register/resolve Alldomains
  • Perpetuals Trading with Adrena Protocol
  • +
  • Drift Vaults, Perps, Lending and Borrowing
  • @@ -164,6 +165,70 @@

    const { signature } = await agent.closeEmptyTokenAccounts();
    +

    Create a drift account with an initial token deposit.

    +
    const result = await agent.createDriftUserAccount()
    +
    + +

    Create a drift vault.

    +
    const signature = await agent.createDriftVault({
    name: "my-drift-vault",
    marketName: "USDC-SPOT",
    redeemPeriod: 1, // in days
    maxTokens: 100000, // in token units e.g 100000 USDC
    minDepositAmount: 5, // in token units e.g 5 USDC
    managementFee: 1, // 1%
    profitShare: 10, // 10%
    hurdleRate: 5, // 5%
    permissioned: false, // public vault or whitelist
    }) +
    + +

    Deposit tokens into a drift vault.

    +
    const signature = await agent.depositIntoDriftVault(100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")
    +
    + +

    Deposit tokens into your drift account.

    +
    const {txSig} = await agent.depositToDriftUserAccount(100, "USDC")
    +
    + +

    Derive a drift vault address.

    +
    const vaultPublicKey = await agent.deriveDriftVaultAddress("my-drift-vault")
    +
    + +

    Check if agent has a drift account.

    +
    const {hasAccount, account} = await agent.doesUserHaveDriftAccount()
    +
    + +

    Get drift account information.

    +
    const accountInfo = await agent.driftUserAccountInfo()
    +
    + +

    Request withdrawal from drift vault.

    +
    const signature = await agent.requestWithdrawalFromDriftVault(100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")
    +
    + +

    Open a perpertual trade using a drift vault that is delegated to you.

    +
    const signature = await agent.tradeUsingDelegatedDriftVault({
    vault: "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU",
    amount: 500,
    symbol: "SOL",
    action: "long",
    type: "limit",
    price: 180 // Please long limit order at $180/SOL
    }) +
    + +

    Open a perpertual trade using your drift account.

    +
    const signature = await agent.tradeUsingDriftPerpAccount({
    amount: 500,
    symbol: "SOL",
    action: "long",
    type: "limit",
    price: 180 // Please long limit order at $180/SOL
    }) +
    + +

    Update drift vault parameters.

    +
    const signature = await agent.updateDriftVault({
    name: "my-drift-vault",
    marketName: "USDC-SPOT",
    redeemPeriod: 1, // in days
    maxTokens: 100000, // in token units e.g 100000 USDC
    minDepositAmount: 5, // in token units e.g 5 USDC
    managementFee: 1, // 1%
    profitShare: 10, // 10%
    hurdleRate: 5, // 5%
    permissioned: false, // public vault or whitelist
    }) +
    + +

    Withdraw tokens from your drift account.

    +
    const {txSig} = await agent.withdrawFromDriftAccount(100, "USDC")
    +
    + +

    Borrow tokens from drift.

    +
    const {txSig} = await agent.withdrawFromDriftAccount(1, "SOL", true)
    +
    + +

    Repay a loan from drift.

    +
    const {txSig} = await agent.depositToDriftUserAccount(1, "SOL", true)
    +
    + +

    Withdraw tokens from a drift vault after the redemption period has elapsed.

    +
    const signature = await agent.withdrawFromDriftVault( "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")
    +
    + +

    Update the address a drift vault is delegated to.

    +
    const signature = await agent.updateDriftVaultDelegate("41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", "new-address")
    +
    +

    The repository includes an advanced example of building a multi-agent system using LangGraph and Solana Agent Kit. Located in examples/agent-kit-langgraph, this example demonstrates:

    • Multi-agent architecture using LangGraph's StateGraph
    • @@ -199,4 +264,4 @@ Refer to CONTRIBUTING.md for detailed guidel

      If you wanna give back any tokens or donations to the OSS community -- The Public Solana Agent Kit Treasury Address:

      Solana Network : EKHTbXpsm6YDgJzMkFxNU1LNXeWcUW7Ezf8mjUNQQ4Pa

      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/Action.html b/docs/interfaces/Action.html index 94d0f09..491e25c 100644 --- a/docs/interfaces/Action.html +++ b/docs/interfaces/Action.html @@ -1,16 +1,16 @@ Action | solana-agent-kit

      Interface Action

      Main Action interface inspired by ELIZA This interface makes it easier to implement actions across different frameworks

      -
      interface Action {
          description: string;
          examples: ActionExample[][];
          handler: Handler;
          name: string;
          schema: ZodType;
          similes: string[];
      }

      Properties

      interface Action {
          description: string;
          examples: ActionExample[][];
          handler: Handler;
          name: string;
          schema: ZodType;
          similes: string[];
      }

      Properties

      description: string

      Detailed description of what the action does

      -
      examples: ActionExample[][]

      Array of example inputs and outputs for the action +

      examples: ActionExample[][]

      Array of example inputs and outputs for the action Each inner array represents a group of related examples

      -
      handler: Handler

      Function that executes the action

      -
      name: string

      Unique name of the action

      -
      schema: ZodType

      Zod schema for input validation

      -
      similes: string[]

      Alternative names/phrases that can trigger this action

      -
      +
      handler: Handler

      Function that executes the action

      +
      name: string

      Unique name of the action

      +
      schema: ZodType

      Zod schema for input validation

      +
      similes: string[]

      Alternative names/phrases that can trigger this action

      +
      diff --git a/docs/interfaces/ActionExample.html b/docs/interfaces/ActionExample.html index 7ce1a6f..719a002 100644 --- a/docs/interfaces/ActionExample.html +++ b/docs/interfaces/ActionExample.html @@ -1,5 +1,5 @@ ActionExample | solana-agent-kit

      Interface ActionExample

      Example of an action with input and output

      -
      interface ActionExample {
          explanation: string;
          input: Record<string, any>;
          output: Record<string, any>;
      }

      Properties

      interface ActionExample {
          explanation: string;
          input: Record<string, any>;
          output: Record<string, any>;
      }

      Properties

      explanation: string
      input: Record<string, any>
      output: Record<string, any>
      +

      Properties

      explanation: string
      input: Record<string, any>
      output: Record<string, any>
      diff --git a/docs/interfaces/BatchOrderPattern.html b/docs/interfaces/BatchOrderPattern.html index b49c652..427e904 100644 --- a/docs/interfaces/BatchOrderPattern.html +++ b/docs/interfaces/BatchOrderPattern.html @@ -1,7 +1,7 @@ -BatchOrderPattern | solana-agent-kit

      Interface BatchOrderPattern

      interface BatchOrderPattern {
          individualQuantity?: number;
          numberOfOrders?: number;
          priceRange?: { max?: number; min?: number };
          side: string;
          spacing?: { type: "percentage" | "fixed"; value: number };
          totalQuantity?: number;
      }

      Properties

      individualQuantity? +BatchOrderPattern | solana-agent-kit

      Interface BatchOrderPattern

      interface BatchOrderPattern {
          individualQuantity?: number;
          numberOfOrders?: number;
          priceRange?: { max?: number; min?: number };
          side: string;
          spacing?: { type: "percentage" | "fixed"; value: number };
          totalQuantity?: number;
      }

      Properties

      individualQuantity?: number
      numberOfOrders?: number
      priceRange?: { max?: number; min?: number }
      side: string
      spacing?: { type: "percentage" | "fixed"; value: number }
      totalQuantity?: number
      +

      Properties

      individualQuantity?: number
      numberOfOrders?: number
      priceRange?: { max?: number; min?: number }
      side: string
      spacing?: { type: "percentage" | "fixed"; value: number }
      totalQuantity?: number
      diff --git a/docs/interfaces/CollectionDeployment.html b/docs/interfaces/CollectionDeployment.html index d2e5ec4..8b300b4 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;
      }

      Properties

      collectionAddress: PublicKey
      signature: Uint8Array
      +

      Properties

      collectionAddress: PublicKey
      signature: Uint8Array
      diff --git a/docs/interfaces/CollectionOptions.html b/docs/interfaces/CollectionOptions.html index f54bfd2..65df11f 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/Config.html b/docs/interfaces/Config.html index 1dfabb1..fda13a4 100644 --- a/docs/interfaces/Config.html +++ b/docs/interfaces/Config.html @@ -1,5 +1,6 @@ -Config | solana-agent-kit

      Interface Config

      interface Config {
          FLASH_PRIVILEGE?: string;
          JUPITER_FEE_BPS?: number;
          JUPITER_REFERRAL_ACCOUNT?: string;
          OPENAI_API_KEY?: string;
      }

      Properties

      FLASH_PRIVILEGE? +Config | solana-agent-kit

      Interface Config

      interface Config {
          FLASH_PRIVILEGE?: string;
          HELIUS_API_KEY?: string;
          JUPITER_FEE_BPS?: number;
          JUPITER_REFERRAL_ACCOUNT?: string;
          OPENAI_API_KEY?: string;
      }

      Properties

      FLASH_PRIVILEGE?: string
      JUPITER_FEE_BPS?: number
      JUPITER_REFERRAL_ACCOUNT?: string
      OPENAI_API_KEY?: string
      +

      Properties

      FLASH_PRIVILEGE?: string
      HELIUS_API_KEY?: string
      JUPITER_FEE_BPS?: number
      JUPITER_REFERRAL_ACCOUNT?: string
      OPENAI_API_KEY?: string
      diff --git a/docs/interfaces/Creator.html b/docs/interfaces/Creator.html index 6a77453..085ccd7 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 index 0e63137..98facdb 100644 --- a/docs/interfaces/FetchPriceResponse.html +++ b/docs/interfaces/FetchPriceResponse.html @@ -1,6 +1,6 @@ -FetchPriceResponse | solana-agent-kit

      Interface FetchPriceResponse

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

      Properties

      code? +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
      +

      Properties

      code?: string
      message?: string
      priceInUSDC?: string
      status: "success" | "error"
      tokenId?: string
      diff --git a/docs/interfaces/FlashCloseTradeParams.html b/docs/interfaces/FlashCloseTradeParams.html index ca7066c..5ad8fac 100644 --- a/docs/interfaces/FlashCloseTradeParams.html +++ b/docs/interfaces/FlashCloseTradeParams.html @@ -1,3 +1,3 @@ -FlashCloseTradeParams | solana-agent-kit

      Interface FlashCloseTradeParams

      interface FlashCloseTradeParams {
          side: "long" | "short";
          token: string;
      }

      Properties

      side +FlashCloseTradeParams | solana-agent-kit

      Interface FlashCloseTradeParams

      interface FlashCloseTradeParams {
          side: "long" | "short";
          token: string;
      }

      Properties

      Properties

      side: "long" | "short"
      token: string
      +

      Properties

      side: "long" | "short"
      token: string
      diff --git a/docs/interfaces/FlashTradeParams.html b/docs/interfaces/FlashTradeParams.html index ce05bc5..a2067aa 100644 --- a/docs/interfaces/FlashTradeParams.html +++ b/docs/interfaces/FlashTradeParams.html @@ -1,5 +1,5 @@ -FlashTradeParams | solana-agent-kit

      Interface FlashTradeParams

      interface FlashTradeParams {
          collateralUsd: number;
          leverage: number;
          side: "long" | "short";
          token: string;
      }

      Properties

      collateralUsd +FlashTradeParams | solana-agent-kit

      Interface FlashTradeParams

      interface FlashTradeParams {
          collateralUsd: number;
          leverage: number;
          side: "long" | "short";
          token: string;
      }

      Properties

      collateralUsd: number
      leverage: number
      side: "long" | "short"
      token: string
      +

      Properties

      collateralUsd: number
      leverage: number
      side: "long" | "short"
      token: string
      diff --git a/docs/interfaces/GibworkCreateTaskReponse.html b/docs/interfaces/GibworkCreateTaskReponse.html index 2bfd6a4..0536ef5 100644 --- a/docs/interfaces/GibworkCreateTaskReponse.html +++ b/docs/interfaces/GibworkCreateTaskReponse.html @@ -1,4 +1,4 @@ -GibworkCreateTaskReponse | solana-agent-kit

      Interface GibworkCreateTaskReponse

      interface GibworkCreateTaskReponse {
          signature?: string;
          status: "success" | "error";
          taskId?: string;
      }

      Properties

      signature? +GibworkCreateTaskReponse | solana-agent-kit

      Interface GibworkCreateTaskReponse

      interface GibworkCreateTaskReponse {
          signature?: string;
          status: "success" | "error";
          taskId?: string;
      }

      Properties

      signature?: string
      status: "success" | "error"
      taskId?: string
      +

      Properties

      signature?: string
      status: "success" | "error"
      taskId?: string
      diff --git a/docs/interfaces/HeliusWebhookIdResponse.html b/docs/interfaces/HeliusWebhookIdResponse.html new file mode 100644 index 0000000..e53b391 --- /dev/null +++ b/docs/interfaces/HeliusWebhookIdResponse.html @@ -0,0 +1,6 @@ +HeliusWebhookIdResponse | solana-agent-kit

      Interface HeliusWebhookIdResponse

      interface HeliusWebhookIdResponse {
          accountAddresses: string[];
          transactionTypes: string[];
          wallet: string;
          webhookType: string;
          webhookURL: string;
      }

      Properties

      accountAddresses: string[]
      transactionTypes: string[]
      wallet: string
      webhookType: string
      webhookURL: string
      diff --git a/docs/interfaces/HeliusWebhookResponse.html b/docs/interfaces/HeliusWebhookResponse.html new file mode 100644 index 0000000..8036f9c --- /dev/null +++ b/docs/interfaces/HeliusWebhookResponse.html @@ -0,0 +1,3 @@ +HeliusWebhookResponse | solana-agent-kit

      Interface HeliusWebhookResponse

      interface HeliusWebhookResponse {
          webhookID: string;
          webhookURL: string;
      }

      Properties

      Properties

      webhookID: string
      webhookURL: string
      diff --git a/docs/interfaces/JupiterTokenData.html b/docs/interfaces/JupiterTokenData.html index d9662aa..06374a8 100644 --- a/docs/interfaces/JupiterTokenData.html +++ b/docs/interfaces/JupiterTokenData.html @@ -1,4 +1,4 @@ -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 +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[]
      +

      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 021827c..59a1d91 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 4f140f0..2abfc64 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/OrderParams.html b/docs/interfaces/OrderParams.html index 5c175df..af4a2c2 100644 --- a/docs/interfaces/OrderParams.html +++ b/docs/interfaces/OrderParams.html @@ -1,4 +1,4 @@ -OrderParams | solana-agent-kit

      Interface OrderParams

      interface OrderParams {
          price: number;
          quantity: number;
          side: string;
      }

      Properties

      price +OrderParams | solana-agent-kit

      Interface OrderParams

      interface OrderParams {
          price: number;
          quantity: number;
          side: string;
      }

      Properties

      Properties

      price: number
      quantity: number
      side: string
      +

      Properties

      price: number
      quantity: number
      side: string
      diff --git a/docs/interfaces/PriorityFeeResponse.html b/docs/interfaces/PriorityFeeResponse.html new file mode 100644 index 0000000..4a02a1d --- /dev/null +++ b/docs/interfaces/PriorityFeeResponse.html @@ -0,0 +1,5 @@ +PriorityFeeResponse | solana-agent-kit

      Interface PriorityFeeResponse

      interface PriorityFeeResponse {
          id: string;
          jsonrpc: string;
          method: string;
          params: { options: { priorityLevel: string }; transaction: string }[];
      }

      Properties

      Properties

      id: string
      jsonrpc: string
      method: string
      params: { options: { priorityLevel: string }; transaction: string }[]
      diff --git a/docs/interfaces/PumpFunTokenOptions.html b/docs/interfaces/PumpFunTokenOptions.html index 1421dc2..f16069c 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 ce6b299..e3c2aa2 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/interfaces/PythFetchPriceResponse.html b/docs/interfaces/PythFetchPriceResponse.html index 97ef79b..803d6f1 100644 --- a/docs/interfaces/PythFetchPriceResponse.html +++ b/docs/interfaces/PythFetchPriceResponse.html @@ -1,7 +1,7 @@ -PythFetchPriceResponse | solana-agent-kit

      Interface PythFetchPriceResponse

      interface PythFetchPriceResponse {
          code?: string;
          message?: string;
          price?: string;
          priceFeedID?: string;
          status: "success" | "error";
          tokenSymbol: string;
      }

      Properties

      code? +PythFetchPriceResponse | solana-agent-kit

      Interface PythFetchPriceResponse

      interface PythFetchPriceResponse {
          code?: string;
          message?: string;
          price?: string;
          priceFeedID?: string;
          status: "success" | "error";
          tokenSymbol: string;
      }

      Properties

      code?: string
      message?: string
      price?: string
      priceFeedID?: string
      status: "success" | "error"
      tokenSymbol: string
      +

      Properties

      code?: string
      message?: string
      price?: string
      priceFeedID?: string
      status: "success" | "error"
      tokenSymbol: string
      diff --git a/docs/interfaces/PythPriceFeedIDItem.html b/docs/interfaces/PythPriceFeedIDItem.html index 318db5d..65ac97d 100644 --- a/docs/interfaces/PythPriceFeedIDItem.html +++ b/docs/interfaces/PythPriceFeedIDItem.html @@ -1,3 +1,3 @@ -PythPriceFeedIDItem | solana-agent-kit

      Interface PythPriceFeedIDItem

      interface PythPriceFeedIDItem {
          attributes: { asset_type: string; base: string };
          id: string;
      }

      Properties

      attributes +PythPriceFeedIDItem | solana-agent-kit

      Interface PythPriceFeedIDItem

      interface PythPriceFeedIDItem {
          attributes: { asset_type: string; base: string };
          id: string;
      }

      Properties

      Properties

      attributes: { asset_type: string; base: string }
      id: string
      +

      Properties

      attributes: { asset_type: string; base: string }
      id: string
      diff --git a/docs/interfaces/PythPriceItem.html b/docs/interfaces/PythPriceItem.html index 168f60e..e845856 100644 --- a/docs/interfaces/PythPriceItem.html +++ b/docs/interfaces/PythPriceItem.html @@ -1,3 +1,3 @@ -PythPriceItem | solana-agent-kit

      Interface PythPriceItem

      interface PythPriceItem {
          binary: { data: string[]; encoding: string };
          parsed: [
              {
                  ema_price: {
                      conf: string;
                      expo: number;
                      price: string;
                      publish_time: number;
                  };
                  id: string;
                  metadata: {
                      prev_publish_time: number;
                      proof_available_time: number;
                      slot: number;
                  };
                  price: {
                      conf: string;
                      expo: number;
                      price: string;
                      publish_time: number;
                  };
              }[],
          ];
      }

      Properties

      binary +PythPriceItem | solana-agent-kit

      Interface PythPriceItem

      interface PythPriceItem {
          binary: { data: string[]; encoding: string };
          parsed: [
              {
                  ema_price: {
                      conf: string;
                      expo: number;
                      price: string;
                      publish_time: number;
                  };
                  id: string;
                  metadata: {
                      prev_publish_time: number;
                      proof_available_time: number;
                      slot: number;
                  };
                  price: {
                      conf: string;
                      expo: number;
                      price: string;
                      publish_time: number;
                  };
              }[],
          ];
      }

      Properties

      Properties

      binary: { data: string[]; encoding: string }
      parsed: [
          {
              ema_price: {
                  conf: string;
                  expo: number;
                  price: string;
                  publish_time: number;
              };
              id: string;
              metadata: {
                  prev_publish_time: number;
                  proof_available_time: number;
                  slot: number;
              };
              price: { conf: string; expo: number; price: string; publish_time: number };
          }[],
      ]
      +

      Properties

      binary: { data: string[]; encoding: string }
      parsed: [
          {
              ema_price: {
                  conf: string;
                  expo: number;
                  price: string;
                  publish_time: number;
              };
              id: string;
              metadata: {
                  prev_publish_time: number;
                  proof_available_time: number;
                  slot: number;
              };
              price: { conf: string; expo: number; price: string; publish_time: number };
          }[],
      ]
      diff --git a/docs/interfaces/TokenCheck.html b/docs/interfaces/TokenCheck.html index b54a877..a7b2037 100644 --- a/docs/interfaces/TokenCheck.html +++ b/docs/interfaces/TokenCheck.html @@ -1,5 +1,5 @@ -TokenCheck | solana-agent-kit

      Interface TokenCheck

      interface TokenCheck {
          risks: {
              description: string;
              level: string;
              name: string;
              score: number;
          }[];
          score: number;
          tokenProgram: string;
          tokenType: string;
      }

      Properties

      risks +TokenCheck | solana-agent-kit

      Interface TokenCheck

      interface TokenCheck {
          risks: {
              description: string;
              level: string;
              name: string;
              score: number;
          }[];
          score: number;
          tokenProgram: string;
          tokenType: string;
      }

      Properties

      risks: { description: string; level: string; name: string; score: number }[]
      score: number
      tokenProgram: string
      tokenType: string
      +

      Properties

      risks: { description: string; level: string; name: string; score: number }[]
      score: number
      tokenProgram: string
      tokenType: string
      diff --git a/docs/modules.html b/docs/modules.html index 0a03fbb..db48637 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1 +1 @@ -solana-agent-kit
      +solana-agent-kit
      diff --git a/docs/types/Handler.html b/docs/types/Handler.html index f800d57..d72437f 100644 --- a/docs/types/Handler.html +++ b/docs/types/Handler.html @@ -1,2 +1,2 @@ Handler | solana-agent-kit

      Type Alias Handler

      Handler: (
          agent: SolanaAgentKit,
          input: Record<string, any>,
      ) => Promise<Record<string, any>>

      Handler function type for executing the action

      -

      Type declaration

        • (
              agent: SolanaAgentKit,
              input: Record<string, any>,
          ): Promise<Record<string, any>>
        • Parameters

          Returns Promise<Record<string, any>>

      +

      Type declaration

        • (
              agent: SolanaAgentKit,
              input: Record<string, any>,
          ): Promise<Record<string, any>>
        • Parameters

          Returns Promise<Record<string, any>>

      diff --git a/docs/variables/actions.html b/docs/variables/actions.html index 3cbb093..c72ea01 100644 --- a/docs/variables/actions.html +++ b/docs/variables/actions.html @@ -1 +1 @@ -ACTIONS | solana-agent-kit

      Variable ACTIONSConst

      ACTIONS: {
          APPROVE_MULTISIG_PROPOSAL_ACTION: Action;
          BALANCE_ACTION: Action;
          CREATE_GIBWORK_TASK_ACTION: Action;
          CREATE_IMAGE_ACTION: Action;
          CREATE_MULTISIG_ACTION: Action;
          CREATE_MULTISIG_PROPOSAL_ACTION: Action;
          CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: Action;
          DEPLOY_COLLECTION_ACTION: Action;
          DEPLOY_TOKEN_ACTION: Action;
          DEPOSIT_TO_MULTISIG_ACTION: Action;
          EXECUTE_MULTISIG_PROPOSAL_ACTION: Action;
          FETCH_PRICE_ACTION: Action;
          FLASH_CLOSE_TRADE_ACTION: Action;
          FLASH_OPEN_TRADE_ACTION: Action;
          GET_ALL_DOMAINS_TLDS_ACTION: Action;
          GET_ALL_REGISTERED_ALL_DOMAINS_ACTION: Action;
          GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION: Action;
          GET_OWNED_ALL_DOMAINS_ACTION: Action;
          GET_OWNED_DOMAINS_FOR_TLD_ACTION: Action;
          GET_PRIMARY_DOMAIN_ACTION: Action;
          GET_TOKEN_DATA_ACTION: Action;
          GET_TPS_ACTION: Action;
          LAUNCH_PUMPFUN_TOKEN_ACTION: Action;
          LEND_ASSET_ACTION: Action;
          MINT_NFT_ACTION: Action;
          PYTH_FETCH_PRICE_ACTION: Action;
          RAYDIUM_CREATE_AMM_V4_ACTION: Action;
          RAYDIUM_CREATE_CPMM_ACTION: Action;
          REGISTER_DOMAIN_ACTION: Action;
          REJECT_MULTISIG_PROPOSAL_ACTION: Action;
          REQUEST_FUNDS_ACTION: Action;
          RESOLVE_DOMAIN_ACTION: Action;
          RESOLVE_SOL_DOMAIN_ACTION: Action;
          STAKE_WITH_JUP_ACTION: Action;
          STAKE_WITH_SOLAYER_ACTION: Action;
          TRADE_ACTION: Action;
          TRANSFER_ACTION: Action;
          TRANSFER_FROM_MULTISIG_ACTION: Action;
          WALLET_ADDRESS_ACTION: Action;
      } = ...

      Type declaration

      • APPROVE_MULTISIG_PROPOSAL_ACTION: Action
      • BALANCE_ACTION: Action
      • CREATE_GIBWORK_TASK_ACTION: Action
      • CREATE_IMAGE_ACTION: Action
      • CREATE_MULTISIG_ACTION: Action
      • CREATE_MULTISIG_PROPOSAL_ACTION: Action
      • CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: Action
      • DEPLOY_COLLECTION_ACTION: Action
      • DEPLOY_TOKEN_ACTION: Action
      • DEPOSIT_TO_MULTISIG_ACTION: Action
      • EXECUTE_MULTISIG_PROPOSAL_ACTION: Action
      • FETCH_PRICE_ACTION: Action
      • FLASH_CLOSE_TRADE_ACTION: Action
      • FLASH_OPEN_TRADE_ACTION: Action
      • GET_ALL_DOMAINS_TLDS_ACTION: Action
      • GET_ALL_REGISTERED_ALL_DOMAINS_ACTION: Action
      • GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION: Action
      • GET_OWNED_ALL_DOMAINS_ACTION: Action
      • GET_OWNED_DOMAINS_FOR_TLD_ACTION: Action
      • GET_PRIMARY_DOMAIN_ACTION: Action
      • GET_TOKEN_DATA_ACTION: Action
      • GET_TPS_ACTION: Action
      • LAUNCH_PUMPFUN_TOKEN_ACTION: Action
      • LEND_ASSET_ACTION: Action
      • MINT_NFT_ACTION: Action
      • PYTH_FETCH_PRICE_ACTION: Action
      • RAYDIUM_CREATE_AMM_V4_ACTION: Action
      • RAYDIUM_CREATE_CPMM_ACTION: Action
      • REGISTER_DOMAIN_ACTION: Action
      • REJECT_MULTISIG_PROPOSAL_ACTION: Action
      • REQUEST_FUNDS_ACTION: Action
      • RESOLVE_DOMAIN_ACTION: Action
      • RESOLVE_SOL_DOMAIN_ACTION: Action
      • STAKE_WITH_JUP_ACTION: Action
      • STAKE_WITH_SOLAYER_ACTION: Action
      • TRADE_ACTION: Action
      • TRANSFER_ACTION: Action
      • TRANSFER_FROM_MULTISIG_ACTION: Action
      • WALLET_ADDRESS_ACTION: Action
      +ACTIONS | solana-agent-kit

      Variable ACTIONSConst

      ACTIONS: {
          APPROVE_MULTISIG_PROPOSAL_ACTION: Action;
          BALANCE_ACTION: Action;
          CREATE_DRIFT_USER_ACCOUNT_ACTION: Action;
          CREATE_DRIFT_VAULT_ACTION: Action;
          CREATE_GIBWORK_TASK_ACTION: Action;
          CREATE_IMAGE_ACTION: Action;
          CREATE_MULTISIG_ACTION: Action;
          CREATE_MULTISIG_PROPOSAL_ACTION: Action;
          CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: Action;
          CREATE_WEBHOOK_ACTION: Action;
          DELETE_WEBHOOK_ACTION: Action;
          DEPLOY_COLLECTION_ACTION: Action;
          DEPLOY_TOKEN_ACTION: Action;
          DEPOSIT_INTO_DRIFT_VAULT_ACTION: Action;
          DEPOSIT_TO_DRIFT_USER_ACCOUNT_ACTION: Action;
          DEPOSIT_TO_MULTISIG_ACTION: Action;
          DERIVE_DRIFT_VAULT_ADDRESS_ACTION: Action;
          DOES_USER_HAVE_DRIFT_ACCOUNT_ACTION: Action;
          DRIFT_USER_ACCOUNT_INFO_ACTION: Action;
          DRIFT_VAULT_INFO_ACTION: Action;
          EXECUTE_MULTISIG_PROPOSAL_ACTION: Action;
          FETCH_PRICE_ACTION: Action;
          FLASH_CLOSE_TRADE_ACTION: Action;
          FLASH_OPEN_TRADE_ACTION: Action;
          GET_ALL_DOMAINS_TLDS_ACTION: Action;
          GET_ALL_REGISTERED_ALL_DOMAINS_ACTION: Action;
          GET_ASSETS_BY_OWNER_ACTION: Action;
          GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION: Action;
          GET_OWNED_ALL_DOMAINS_ACTION: Action;
          GET_OWNED_DOMAINS_FOR_TLD_ACTION: Action;
          GET_PRIMARY_DOMAIN_ACTION: Action;
          GET_TOKEN_DATA_ACTION: Action;
          GET_TPS_ACTION: Action;
          GET_WEBHOOK_ACTION: Action;
          LAUNCH_PUMPFUN_TOKEN_ACTION: Action;
          LEND_ASSET_ACTION: Action;
          MINT_NFT_ACTION: Action;
          PARSE_TRANSACTION_ACTION: Action;
          PYTH_FETCH_PRICE_ACTION: Action;
          RAYDIUM_CREATE_AMM_V4_ACTION: Action;
          RAYDIUM_CREATE_CPMM_ACTION: Action;
          REGISTER_DOMAIN_ACTION: Action;
          REJECT_MULTISIG_PROPOSAL_ACTION: Action;
          REQUEST_FUNDS_ACTION: Action;
          REQUEST_WITHDRAWAL_FROM_DRIFT_VAULT_ACTION: Action;
          RESOLVE_DOMAIN_ACTION: Action;
          RESOLVE_SOL_DOMAIN_ACTION: Action;
          SEND_TRANSACTION_WITH_PRIORITY_ACTION: Action;
          STAKE_WITH_JUP_ACTION: Action;
          STAKE_WITH_SOLAYER_ACTION: Action;
          TRADE_ACTION: Action;
          TRADE_DELEGATED_DRIFT_VAULT_ACTION: Action;
          TRADE_DRIFT_PERP_ACCOUNT_ACTION: Action;
          TRANSFER_ACTION: Action;
          TRANSFER_FROM_MULTISIG_ACTION: Action;
          UPDATE_DRIFT_VAULT_ACTION: Action;
          UPDATE_DRIFT_VAULT_DELEGATE_ACTION: Action;
          WALLET_ADDRESS_ACTION: Action;
          WITHDRAW_FROM_DRIFT_VAULT_ACTION: Action;
          WITHDRAW_OR_BORROW_FROM_DRIFT_ACCOUNT_ACTION: Action;
      } = ...

      Type declaration

      • APPROVE_MULTISIG_PROPOSAL_ACTION: Action
      • BALANCE_ACTION: Action
      • CREATE_DRIFT_USER_ACCOUNT_ACTION: Action
      • CREATE_DRIFT_VAULT_ACTION: Action
      • CREATE_GIBWORK_TASK_ACTION: Action
      • CREATE_IMAGE_ACTION: Action
      • CREATE_MULTISIG_ACTION: Action
      • CREATE_MULTISIG_PROPOSAL_ACTION: Action
      • CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: Action
      • CREATE_WEBHOOK_ACTION: Action
      • DELETE_WEBHOOK_ACTION: Action
      • DEPLOY_COLLECTION_ACTION: Action
      • DEPLOY_TOKEN_ACTION: Action
      • DEPOSIT_INTO_DRIFT_VAULT_ACTION: Action
      • DEPOSIT_TO_DRIFT_USER_ACCOUNT_ACTION: Action
      • DEPOSIT_TO_MULTISIG_ACTION: Action
      • DERIVE_DRIFT_VAULT_ADDRESS_ACTION: Action
      • DOES_USER_HAVE_DRIFT_ACCOUNT_ACTION: Action
      • DRIFT_USER_ACCOUNT_INFO_ACTION: Action
      • DRIFT_VAULT_INFO_ACTION: Action
      • EXECUTE_MULTISIG_PROPOSAL_ACTION: Action
      • FETCH_PRICE_ACTION: Action
      • FLASH_CLOSE_TRADE_ACTION: Action
      • FLASH_OPEN_TRADE_ACTION: Action
      • GET_ALL_DOMAINS_TLDS_ACTION: Action
      • GET_ALL_REGISTERED_ALL_DOMAINS_ACTION: Action
      • GET_ASSETS_BY_OWNER_ACTION: Action
      • GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION: Action
      • GET_OWNED_ALL_DOMAINS_ACTION: Action
      • GET_OWNED_DOMAINS_FOR_TLD_ACTION: Action
      • GET_PRIMARY_DOMAIN_ACTION: Action
      • GET_TOKEN_DATA_ACTION: Action
      • GET_TPS_ACTION: Action
      • GET_WEBHOOK_ACTION: Action
      • LAUNCH_PUMPFUN_TOKEN_ACTION: Action
      • LEND_ASSET_ACTION: Action
      • MINT_NFT_ACTION: Action
      • PARSE_TRANSACTION_ACTION: Action
      • PYTH_FETCH_PRICE_ACTION: Action
      • RAYDIUM_CREATE_AMM_V4_ACTION: Action
      • RAYDIUM_CREATE_CPMM_ACTION: Action
      • REGISTER_DOMAIN_ACTION: Action
      • REJECT_MULTISIG_PROPOSAL_ACTION: Action
      • REQUEST_FUNDS_ACTION: Action
      • REQUEST_WITHDRAWAL_FROM_DRIFT_VAULT_ACTION: Action
      • RESOLVE_DOMAIN_ACTION: Action
      • RESOLVE_SOL_DOMAIN_ACTION: Action
      • SEND_TRANSACTION_WITH_PRIORITY_ACTION: Action
      • STAKE_WITH_JUP_ACTION: Action
      • STAKE_WITH_SOLAYER_ACTION: Action
      • TRADE_ACTION: Action
      • TRADE_DELEGATED_DRIFT_VAULT_ACTION: Action
      • TRADE_DRIFT_PERP_ACCOUNT_ACTION: Action
      • TRANSFER_ACTION: Action
      • TRANSFER_FROM_MULTISIG_ACTION: Action
      • UPDATE_DRIFT_VAULT_ACTION: Action
      • UPDATE_DRIFT_VAULT_DELEGATE_ACTION: Action
      • WALLET_ADDRESS_ACTION: Action
      • WITHDRAW_FROM_DRIFT_VAULT_ACTION: Action
      • WITHDRAW_OR_BORROW_FROM_DRIFT_ACCOUNT_ACTION: Action
      diff --git a/src/tools/drift/drift_vault.ts b/src/tools/drift/drift_vault.ts index 541c117..feb23f1 100644 --- a/src/tools/drift/drift_vault.ts +++ b/src/tools/drift/drift_vault.ts @@ -14,10 +14,8 @@ import { PRICE_PRECISION, QUOTE_PRECISION, TEN, - User, } from "@drift-labs/sdk"; import { - VaultAccount, WithdrawUnit, decodeName, encodeName, From c71f2159fdd13f821bea3b14b35aeaa234239245 Mon Sep 17 00:00:00 2001 From: jakeyvee Date: Wed, 15 Jan 2025 18:15:35 +0800 Subject: [PATCH 21/32] fix: changes for Voltr vault program upgrade --- package.json | 2 +- pnpm-lock.yaml | 10 +-- src/agent/index.ts | 6 +- src/langchain/index.ts | 10 +-- src/tools/index.ts | 2 +- src/tools/voltr_deposit_strategy.ts | 88 ++++++++++++++-------- src/tools/voltr_get_asset_amount.ts | 33 -------- src/tools/voltr_get_position_values.ts | 20 +++++ src/tools/voltr_withdraw_strategy.ts | 100 +++++++++++++------------ 9 files changed, 141 insertions(+), 130 deletions(-) delete mode 100644 src/tools/voltr_get_asset_amount.ts create mode 100644 src/tools/voltr_get_position_values.ts diff --git a/package.json b/package.json index f34069a..9366317 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@tensor-oss/tensorswap-sdk": "^4.5.0", "@solana/web3.js": "^1.98.0", "@tiplink/api": "^0.3.1", - "@voltr/sdk": "^0.1.0", + "@voltr/vault-sdk": "^0.1.1", "bn.js": "^5.2.1", "bs58": "^6.0.0", "chai": "^5.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 754d7ac..0851b6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,9 +80,9 @@ dependencies: '@tiplink/api': specifier: ^0.3.1 version: 0.3.1(fastestsmallesttextencoderdecoder@1.0.22)(sodium-native@3.4.1) - '@voltr/sdk': - specifier: ^0.1.0 - version: 0.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@voltr/vault-sdk': + specifier: ^0.1.1 + version: 0.1.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) ai: specifier: ^4.0.22 version: 4.0.25(react@19.0.0)(zod@3.24.1) @@ -2303,8 +2303,8 @@ packages: /@ungap/structured-clone@1.2.1: resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - /@voltr/sdk@0.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): - resolution: {integrity: sha512-iLb0zc3ClZYJ9DBgMeuONSnZKa8r54MGj2LfN+4ZXXDx/O+ssjuuFPE+tcmWU0tL0yfHOLRgwWEPc4yynWG3Rg==} + /@voltr/vault-sdk@0.1.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2): + resolution: {integrity: sha512-xh8bxPCwNpjVqEN32+Q40Xf08vdORAmQACDE6ru3T+9qrwNgraLcPEzvWeBNTE0FAMAZdNsYOxWbc2FSK0ZQww==} dependencies: '@coral-xyz/anchor': 0.30.1 '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) diff --git a/src/agent/index.ts b/src/agent/index.ts index 3f811bd..f5c44e8 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -55,7 +55,7 @@ import { fetchTokenReportSummary, fetchTokenDetailedReport, OrderParams, - voltrGetAssetAmount, + voltrGetPositionValues, voltrDepositStrategy, voltrWithdrawStrategy, } from "../tools"; @@ -517,7 +517,7 @@ export class SolanaAgentKit { return voltrWithdrawStrategy(this, withdrawAmount, vault, strategy); } - async voltrGetAssetAmount(vault: PublicKey): Promise { - return voltrGetAssetAmount(this, vault); + async voltrGetPositionValues(vault: PublicKey): Promise { + return voltrGetPositionValues(this, vault); } } diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 2fbe3cc..78f130e 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -2083,9 +2083,9 @@ export class SolanaVoltrWithdrawStrategy extends Tool { } } -export class SolanaVoltrGetAssetAmount extends Tool { - name = "solana_voltr_get_asset_amount"; - description = `Get the total asset amount and current amount for each strategy of a given Voltr vault +export class SolanaVoltrGetPositionValues extends Tool { + name = "solana_voltr_get_position_values"; + description = `Get the total asset value and current value for each strategy of a given Voltr vault Inputs: vault: string (required) @@ -2094,7 +2094,7 @@ export class SolanaVoltrGetAssetAmount extends Tool { super(); } async _call(input: string): Promise { - return this.solanaKit.voltrGetAssetAmount(new PublicKey(input)); + return this.solanaKit.voltrGetPositionValues(new PublicKey(input)); } } @@ -2152,6 +2152,6 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaFetchTokenDetailedReportTool(solanaKit), new SolanaVoltrDepositStrategy(solanaKit), new SolanaVoltrWithdrawStrategy(solanaKit), - new SolanaVoltrGetAssetAmount(solanaKit), + new SolanaVoltrGetPositionValues(solanaKit), ]; } diff --git a/src/tools/index.ts b/src/tools/index.ts index 2e6f4db..6c4cea0 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -61,4 +61,4 @@ export * from "./rugcheck"; export * from "./voltr_deposit_strategy"; export * from "./voltr_withdraw_strategy"; -export * from "./voltr_get_asset_amount"; \ No newline at end of file +export * from "./voltr_get_position_values"; \ No newline at end of file diff --git a/src/tools/voltr_deposit_strategy.ts b/src/tools/voltr_deposit_strategy.ts index 4d2aa22..bd94824 100644 --- a/src/tools/voltr_deposit_strategy.ts +++ b/src/tools/voltr_deposit_strategy.ts @@ -1,10 +1,11 @@ -import { VoltrClient } from "@voltr/sdk"; +import { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; import { SolanaAgentKit } from "../agent"; import { PublicKey, sendAndConfirmTransaction, Transaction, } from "@solana/web3.js"; +import { VoltrClient } from "@voltr/vault-sdk"; import BN from "bn.js"; /** @@ -22,13 +23,21 @@ export async function voltrDepositStrategy( strategy: PublicKey, ): Promise { const vc = new VoltrClient(agent.connection, agent.wallet); - const { vaultAssetIdleAuth } = vc.findVaultAddresses(vault); const vaultAccount = await vc.fetchVaultAccount(vault); - const vaultAssetMint = vaultAccount.asset.assetMint; - const strategyAccount = await vc.fetchStrategyAccount(strategy); - const liquidityReserve = strategyAccount.counterpartyAssetTa; - const protocolProgram = strategyAccount.protocolProgram; - const vaultStrategy = vc.findVaultStrategy(vaultAssetIdleAuth, strategy); + const vaultAssetMint = vaultAccount.asset.mint; + const assetTokenProgram = await agent.connection + .getAccountInfo(new PublicKey(vaultAssetMint)) + .then((account) => account?.owner); + + if ( + !assetTokenProgram || + !( + assetTokenProgram.equals(TOKEN_PROGRAM_ID) || + assetTokenProgram.equals(TOKEN_2022_PROGRAM_ID) + ) + ) { + throw new Error("Invalid asset token program"); + } const response = await fetch( `https://voltr.xyz/api/remaining-accounts/deposit-strategy?vault=${vault.toBase58()}&strategy=${strategy.toBase58()}`, @@ -41,37 +50,50 @@ export async function voltrDepositStrategy( ); const data = (await response.json()).data as { - pubkey: string; - isSigner: boolean; - isWritable: boolean; - }[]; + instructionDiscriminator: number[] | null; + additionalArgs: number[] | null; + remainingAccounts: + | { + pubkey: string; + isSigner: boolean; + isWritable: boolean; + }[] + | null; + }; - const remainingAccounts = data.map((account) => ({ - pubkey: new PublicKey(account.pubkey), - isSigner: account.isSigner, - isWritable: account.isWritable, - })); + const additionalArgs = data.additionalArgs + ? Buffer.from(data.additionalArgs) + : null; + const instructionDiscriminator = data.instructionDiscriminator + ? Buffer.from(data.instructionDiscriminator) + : null; + const remainingAccounts = + data.remainingAccounts?.map((account) => ({ + pubkey: new PublicKey(account.pubkey), + isSigner: account.isSigner, + isWritable: account.isWritable, + })) ?? []; - const depositIx = await vc.createDepositStrategyIx(depositAmount, { - vault, - vaultAssetMint, - strategy: strategy, - vaultStrategy: vaultStrategy, - counterpartyAssetTa: liquidityReserve, - protocolProgram: protocolProgram, - remainingAccounts, - }); + const depositIx = await vc.createDepositStrategyIx( + { + depositAmount, + additionalArgs, + instructionDiscriminator, + }, + { + vault, + vaultAssetMint, + strategy: strategy, + assetTokenProgram, + remainingAccounts, + }, + ); const transaction = new Transaction(); transaction.add(depositIx); - const txSig = await sendAndConfirmTransaction( - agent.connection, - transaction, - [agent.wallet], - { - commitment: "confirmed", - }, - ); + const txSig = await sendAndConfirmTransaction(agent.connection, transaction, [ + agent.wallet, + ]); return txSig; } diff --git a/src/tools/voltr_get_asset_amount.ts b/src/tools/voltr_get_asset_amount.ts deleted file mode 100644 index 9d16923..0000000 --- a/src/tools/voltr_get_asset_amount.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { VoltrClient } from "@voltr/sdk"; -import { SolanaAgentKit } from "../agent"; -import { PublicKey } from "@solana/web3.js"; -import BN from "bn.js"; - -/** - * Deposits assets into a Voltr strategy - * @param agent SolanaAgentKit instance - * @param vault Public key of the target vault - * @returns Transaction signature for the deposit - */ -export async function voltrGetAssetAmount( - agent: SolanaAgentKit, - vault: PublicKey, -): Promise { - const vc = new VoltrClient(agent.connection, agent.wallet); - const vaultAccount = await vc.fetchVaultAccount(vault); - const totalAssetAmount: BN = vaultAccount.asset.totalAmount; - const { vaultAssetIdleAuth } = vc.findVaultAddresses(vault); - const vaultStrategyAccounts = - await vc.fetchVaultStrategyAccounts(vaultAssetIdleAuth); - const strategyInfo = vaultStrategyAccounts.map((vaultStrategyAccount) => ({ - strategyId: vaultStrategyAccount.account.strategy.toBase58(), - amount: vaultStrategyAccount.account.currentAmount.toString(), - })); - - const result = { - totalAmount: totalAssetAmount.toString(), - strategies: strategyInfo, - }; - - return JSON.stringify(result); -} diff --git a/src/tools/voltr_get_position_values.ts b/src/tools/voltr_get_position_values.ts new file mode 100644 index 0000000..43ecff3 --- /dev/null +++ b/src/tools/voltr_get_position_values.ts @@ -0,0 +1,20 @@ +import { SolanaAgentKit } from "../agent"; +import { PublicKey } from "@solana/web3.js"; +import { VoltrClient } from "@voltr/vault-sdk"; + +/** + * Gets the value of assets in a Voltr vault + * @param agent SolanaAgentKit instance + * @param vault Public key of the target vault + * @returns Position and total values for the vault + */ +export async function voltrGetPositionValues( + agent: SolanaAgentKit, + vault: PublicKey, +): Promise { + const vc = new VoltrClient(agent.connection, agent.wallet); + const positionAndTotalValues = + await vc.getPositionAndTotalValuesForVault(vault); + + return JSON.stringify(positionAndTotalValues); +} diff --git a/src/tools/voltr_withdraw_strategy.ts b/src/tools/voltr_withdraw_strategy.ts index 6e8ed27..ef567b5 100644 --- a/src/tools/voltr_withdraw_strategy.ts +++ b/src/tools/voltr_withdraw_strategy.ts @@ -1,4 +1,3 @@ -import { VoltrClient } from "@voltr/sdk"; import { SolanaAgentKit } from "../agent"; import { PublicKey, @@ -6,12 +5,8 @@ import { Transaction, } from "@solana/web3.js"; import BN from "bn.js"; -import { - Account, - getAccount, - TOKEN_2022_PROGRAM_ID, - TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; +import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { VoltrClient } from "@voltr/vault-sdk"; /** * Withdraws assets from a Voltr strategy @@ -28,34 +23,24 @@ export async function voltrWithdrawStrategy( strategy: PublicKey, ): Promise { const vc = new VoltrClient(agent.connection, agent.wallet); - const { vaultAssetIdleAuth } = vc.findVaultAddresses(vault); const vaultAccount = await vc.fetchVaultAccount(vault); - const vaultAssetMint = vaultAccount.asset.assetMint; - const strategyAccount = await vc.fetchStrategyAccount(strategy); - const liquidityReserve = strategyAccount.counterpartyAssetTa; - const protocolProgram = strategyAccount.protocolProgram; - const vaultStrategy = vc.findVaultStrategy(vaultAssetIdleAuth, strategy); + const vaultAssetMint = vaultAccount.asset.mint; + const assetTokenProgram = await agent.connection + .getAccountInfo(new PublicKey(vaultAssetMint)) + .then((account) => account?.owner); - let liquidityReserveAccount: Account; - try { - liquidityReserveAccount = await getAccount( - agent.connection, - liquidityReserve, - "confirmed", - TOKEN_PROGRAM_ID, - ); - } catch (error) { - liquidityReserveAccount = await getAccount( - agent.connection, - liquidityReserve, - "confirmed", - TOKEN_2022_PROGRAM_ID, - ); + if ( + !assetTokenProgram || + !( + assetTokenProgram.equals(TOKEN_PROGRAM_ID) || + assetTokenProgram.equals(TOKEN_2022_PROGRAM_ID) + ) + ) { + throw new Error("Invalid asset token program"); } - const liquidityReserveAuth = liquidityReserveAccount.owner; const response = await fetch( - `https://voltr.xyz/api/remaining-accounts/withdraw-strategy?vault=${vault.toBase58()}&strategy=${strategy.toBase58()}`, + `https://voltr.xyz/api/remaining-accounts/deposit-strategy?vault=${vault.toBase58()}&strategy=${strategy.toBase58()}`, { method: "GET", headers: { @@ -65,27 +50,44 @@ export async function voltrWithdrawStrategy( ); const data = (await response.json()).data as { - pubkey: string; - isSigner: boolean; - isWritable: boolean; - }[]; + instructionDiscriminator: number[] | null; + additionalArgs: number[] | null; + remainingAccounts: + | { + pubkey: string; + isSigner: boolean; + isWritable: boolean; + }[] + | null; + }; - const remainingAccounts = data.map((account) => ({ - pubkey: new PublicKey(account.pubkey), - isSigner: account.isSigner, - isWritable: account.isWritable, - })); + const additionalArgs = data.additionalArgs + ? Buffer.from(data.additionalArgs) + : null; + const instructionDiscriminator = data.instructionDiscriminator + ? Buffer.from(data.instructionDiscriminator) + : null; + const remainingAccounts = + data.remainingAccounts?.map((account) => ({ + pubkey: new PublicKey(account.pubkey), + isSigner: account.isSigner, + isWritable: account.isWritable, + })) ?? []; - const withdrawIx = await vc.createWithdrawStrategyIx(withdrawAmount, { - vault, - vaultAssetMint, - strategy: strategy, - vaultStrategy: vaultStrategy, - counterpartyAssetTa: liquidityReserve, - counterpartyAssetTaAuth: liquidityReserveAuth, - protocolProgram: protocolProgram, - remainingAccounts, - }); + const withdrawIx = await vc.createWithdrawStrategyIx( + { + withdrawAmount, + additionalArgs, + instructionDiscriminator, + }, + { + vault, + vaultAssetMint, + strategy, + assetTokenProgram, + remainingAccounts, + }, + ); const transaction = new Transaction(); transaction.add(withdrawIx); From 2971bdaef4af952447c10f60e55928179bedb17b Mon Sep 17 00:00:00 2001 From: jakeyvee Date: Wed, 15 Jan 2025 21:21:13 +0800 Subject: [PATCH 22/32] feat: include Voltr into readme --- README.md | 32 ++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fdedb8..096b2ec 100644 --- a/README.md +++ b/README.md @@ -471,6 +471,38 @@ Update the address a drift vault is delegated to. const signature = await agent.updateDriftVaultDelegate("41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", "new-address") ``` +### Get Voltr Vault Position Values + +Get the current position values and total value of assets in a Voltr vault. + +```typescript +const values = await agent.voltrGetPositionValues("7opUkqYtxmQRriZvwZkPcg6LqmGjAh1RSEsVrdsGDx5K") +``` + +### Deposit into Voltr Strategy + +Deposit assets into a specific strategy within a Voltr vault. + +```typescript +const signature = await agent.voltrDepositStrategy( + new BN("1000000000"), // amount in base units (e.g., 1 USDC = 1000000) + "7opUkqYtxmQRriZvwZkPcg6LqmGjAh1RSEsVrdsGDx5K", // vault + "9ZQQYvr4x7AMqd6abVa1f5duGjti5wk1MHsX6hogPsLk" // strategy +) +``` + +### Withdraw from Voltr Strategy + +Withdraw assets from a specific strategy within a Voltr vault. + +```typescript +const signature = await agent.voltrWithdrawStrategy( + new BN("1000000000"), // amount in base units (e.g., 1 USDC = 1000000) + "7opUkqYtxmQRriZvwZkPcg6LqmGjAh1RSEsVrdsGDx5K", // vault + "9ZQQYvr4x7AMqd6abVa1f5duGjti5wk1MHsX6hogPsLk" // strategy +) +``` + ## Examples ### LangGraph Multi-Agent System diff --git a/package.json b/package.json index 91ab280..f0bf882 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@sqds/multisig": "^2.1.3", "@tensor-oss/tensorswap-sdk": "^4.5.0", "@tiplink/api": "^0.3.1", - "@voltr/vault-sdk": "^0.1.1", + "@voltr/vault-sdk": "^0.1.1", "ai": "^4.0.22", "bn.js": "^5.2.1", "bs58": "^6.0.0", From e3c93222de6d9160efcb8b23a499be6592e9bbf7 Mon Sep 17 00:00:00 2001 From: jakeyvee Date: Wed, 15 Jan 2025 21:28:09 +0800 Subject: [PATCH 23/32] chore: export voltr folder instead of indiv files in tools --- src/tools/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tools/index.ts b/src/tools/index.ts index a9d653d..b02c01c 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -25,6 +25,4 @@ export * from "./tiplink"; export * from "./lightprotocol"; export * from "./squads"; export * from "./helius"; -export * from "./voltr/voltr_deposit_strategy"; -export * from "./voltr/voltr_withdraw_strategy"; -export * from "./voltr/voltr_get_position_values"; +export * from "./voltr"; From 484a64de851755d0cdbc642c19a16f87ed67ef3a Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Wed, 15 Jan 2025 14:52:13 +0100 Subject: [PATCH 24/32] fix: drift user account info fetching --- src/tools/drift/drift.ts | 4 +- test/agent_sdks/vercel_ai.ts | 272 +++++++++++++++++------------------ 2 files changed, 139 insertions(+), 137 deletions(-) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 97105a4..1a8b4a9 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -254,7 +254,7 @@ export async function withdrawFromDriftUserAccount( const tx = new Transaction().add(...withdrawInstruction).add( ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 0.000001 * 1000000 * 1000000, + microLamports: 0.000003 * 1000000 * 1000000, }), ); tx.recentBlockhash = latestBlockhash.blockhash; @@ -388,9 +388,11 @@ export async function doesUserHaveDriftAccount(agent: SolanaAgentKit) { agent.wallet.publicKey, ), }); + await user.subscribe(); user.getActivePerpPositions(); const userAccountExists = await user.exists(); await cleanUp(); + await user.unsubscribe(); return { hasAccount: userAccountExists, account: user.userAccountPublicKey, diff --git a/test/agent_sdks/vercel_ai.ts b/test/agent_sdks/vercel_ai.ts index 77fda22..8fd19c1 100644 --- a/test/agent_sdks/vercel_ai.ts +++ b/test/agent_sdks/vercel_ai.ts @@ -8,191 +8,191 @@ import { createOpenAI } from "@ai-sdk/openai"; dotenv.config(); function validateEnvironment(): void { - const missingVars: string[] = []; - const requiredVars = ["OPENAI_API_KEY", "RPC_URL", "SOLANA_PRIVATE_KEY"]; + const missingVars: string[] = []; + const requiredVars = ["OPENAI_API_KEY", "RPC_URL", "SOLANA_PRIVATE_KEY"]; - requiredVars.forEach((varName) => { - if (!process.env[varName]) { - missingVars.push(varName); - } - }); + requiredVars.forEach((varName) => { + if (!process.env[varName]) { + missingVars.push(varName); + } + }); - if (missingVars.length > 0) { - console.error("Error: Required environment variables are not set"); - missingVars.forEach((varName) => { - console.error(`${varName}=your_${varName.toLowerCase()}_here`); - }); - process.exit(1); - } + if (missingVars.length > 0) { + console.error("Error: Required environment variables are not set"); + missingVars.forEach((varName) => { + console.error(`${varName}=your_${varName.toLowerCase()}_here`); + }); + process.exit(1); + } } validateEnvironment(); async function runAutonomousMode(interval = 10) { - console.log("Starting autonomous mode..."); - const openai = createOpenAI({ - apiKey: process.env.OPENAI_API_KEY as string, - }); + console.log("Starting autonomous mode..."); + const openai = createOpenAI({ + apiKey: process.env.OPENAI_API_KEY as string, + }); - const solanaAgent = new SolanaAgentKit( - process.env.SOLANA_PRIVATE_KEY!, - process.env.RPC_URL!, - { - OPENAI_API_KEY: process.env.OPENAI_API_KEY!, - }, - ); + const solanaAgent = new SolanaAgentKit( + process.env.SOLANA_PRIVATE_KEY!, + process.env.RPC_URL!, + { + OPENAI_API_KEY: process.env.OPENAI_API_KEY!, + }, + ); - const tools = createVercelAITools(solanaAgent); + const tools = createVercelAITools(solanaAgent); - while (true) { - try { - const thought = - "Be creative and do something interesting on the blockchain. " + - "Choose an action or set of actions and execute it that highlights your abilities."; + while (true) { + try { + const thought = + "Be creative and do something interesting on the blockchain. " + + "Choose an action or set of actions and execute it that highlights your abilities."; - const response = streamText({ - prompt: thought, - tools, - model: openai("gpt-4o-mini"), - temperature: 0.7, - system: `You are a helpful agent that can interact onchain using the Solana Agent Kit. You are + const response = streamText({ + prompt: thought, + tools, + model: openai("gpt-4o-mini"), + temperature: 0.7, + system: `You are a helpful agent that can interact onchain using the Solana Agent Kit. You are empowered to interact onchain using your tools. If you ever need funds, you can request them from the faucet. If not, you can provide your wallet details and request funds from the user. If there is a 5XX (internal) HTTP error code, ask the user to try again later. If someone asks you to do something you can't do with your currently available tools, you must say so, and encourage them to implement it themselves using the Solana Agent Kit, recommend they go to https://www.solanaagentkit.xyz for more information. Be concise and helpful with your responses. Refrain from restating your tools' descriptions unless it is explicitly requested.`, - maxSteps: 10, - }); + maxSteps: 10, + }); - for await (const textPart of response.textStream) { - process.stdout.write(textPart); - } - console.log(); + for await (const textPart of response.textStream) { + process.stdout.write(textPart); + } + console.log(); - await new Promise((resolve) => setTimeout(resolve, interval * 1000)); - } catch (error) { - if (error instanceof Error) { - console.error("Error:", error.message); - } - process.exit(1); - } - } + await new Promise((resolve) => setTimeout(resolve, interval * 1000)); + } catch (error) { + if (error instanceof Error) { + console.error("Error:", error.message); + } + process.exit(1); + } + } } async function runChatMode() { - console.log("Starting chat mode... Type 'exit' to end."); - const openai = createOpenAI({ - apiKey: process.env.OPENAI_API_KEY as string, - }); + console.log("Starting chat mode... Type 'exit' to end."); + const openai = createOpenAI({ + apiKey: process.env.OPENAI_API_KEY as string, + }); - const solanaAgent = new SolanaAgentKit( - process.env.SOLANA_PRIVATE_KEY!, - process.env.RPC_URL!, - { - OPENAI_API_KEY: process.env.OPENAI_API_KEY!, - }, - ); + const solanaAgent = new SolanaAgentKit( + process.env.SOLANA_PRIVATE_KEY!, + process.env.RPC_URL!, + { + OPENAI_API_KEY: process.env.OPENAI_API_KEY!, + }, + ); - const tools = createVercelAITools(solanaAgent); - console.log(tools); + const tools = createVercelAITools(solanaAgent); + console.log(tools); - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); - const question = (prompt: string): Promise => - new Promise((resolve) => rl.question(prompt, resolve)); + const question = (prompt: string): Promise => + new Promise((resolve) => rl.question(prompt, resolve)); - try { - while (true) { - const userInput = await question("\nPrompt: "); + try { + while (true) { + const userInput = await question("\nPrompt: "); - if (userInput.toLowerCase() === "exit") { - break; - } + if (userInput.toLowerCase() === "exit") { + break; + } - const response = streamText({ - prompt: userInput, - tools, - model: openai("gpt-4o-mini"), - temperature: 0.7, - system: `You are a helpful agent that can interact onchain using the Solana Agent Kit. You are + const response = streamText({ + prompt: userInput, + tools, + model: openai("gpt-4o-mini"), + temperature: 0.7, + system: `You are a helpful agent that can interact onchain using the Solana Agent Kit. You are empowered to interact onchain using your tools. If you ever need funds, you can request them from the faucet. If not, you can provide your wallet details and request funds from the user. If there is a 5XX (internal) HTTP error code, ask the user to try again later. If someone asks you to do something you can't do with your currently available tools, you must say so, and encourage them to implement it themselves using the Solana Agent Kit, recommend they go to https://www.solanaagentkit.xyz for more information. Be concise and helpful with your responses. Refrain from restating your tools' descriptions unless it is explicitly requested.`, - maxSteps: 10, - }); + maxSteps: 10, + }); - for await (const textPart of response.textStream) { - process.stdout.write(textPart); - } - console.log(); - } - } catch (error) { - if (error instanceof Error) { - console.error("Error:", error.message); - } - process.exit(1); - } finally { - rl.close(); - } + for await (const textPart of response.textStream) { + process.stdout.write(textPart); + } + console.log(); + } + } catch (error) { + if (error instanceof Error) { + console.error("Error:", error.message); + } + process.exit(1); + } finally { + rl.close(); + } } async function chooseMode(): Promise<"chat" | "auto"> { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); - const question = (prompt: string): Promise => - new Promise((resolve) => rl.question(prompt, resolve)); + const question = (prompt: string): Promise => + new Promise((resolve) => rl.question(prompt, resolve)); - while (true) { - console.log("\nAvailable modes:"); - console.log("1. chat - Interactive chat mode"); - console.log("2. auto - Autonomous action mode"); + while (true) { + console.log("\nAvailable modes:"); + console.log("1. chat - Interactive chat mode"); + console.log("2. auto - Autonomous action mode"); - const choice = (await question("\nChoose a mode (enter number or name): ")) - .toLowerCase() - .trim(); + const choice = (await question("\nChoose a mode (enter number or name): ")) + .toLowerCase() + .trim(); - rl.close(); + rl.close(); - if (choice === "1" || choice === "chat") { - return "chat"; - } else if (choice === "2" || choice === "auto") { - return "auto"; - } - console.log("Invalid choice. Please try again."); - } + if (choice === "1" || choice === "chat") { + return "chat"; + } else if (choice === "2" || choice === "auto") { + return "auto"; + } + console.log("Invalid choice. Please try again."); + } } async function main() { - try { - console.log("Starting Agent..."); - const mode = await chooseMode(); + try { + console.log("Starting Agent..."); + const mode = await chooseMode(); - if (mode === "chat") { - await runChatMode(); - } else { - await runAutonomousMode(); - } - } catch (error) { - if (error instanceof Error) { - console.error("Error:", error.message); - } - process.exit(1); - } + if (mode === "chat") { + await runChatMode(); + } else { + await runAutonomousMode(); + } + } catch (error) { + if (error instanceof Error) { + console.error("Error:", error.message); + } + process.exit(1); + } } if (require.main === module) { - main().catch((error) => { - console.error("Fatal error:", error); - process.exit(1); - }); + main().catch((error) => { + console.error("Fatal error:", error); + process.exit(1); + }); } From 6635d0e934458ffac080131b65836e22a23e197e Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Wed, 15 Jan 2025 15:45:30 +0100 Subject: [PATCH 25/32] fix: failing CI workflow --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c862186..6b4d5a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,9 @@ jobs: with: version: 9.4.0 + - name: Install node-gyp prerequisites + run: sudo apt update && sudo apt install -y build-essential python3 pkg-config libudev-dev libusb-1.0-0-dev + - uses: actions/setup-node@v4 with: node-version: "23" @@ -21,7 +24,7 @@ jobs: - name: Install dependencies run: pnpm install -r --no-frozen-lockfile - + - name: Run lint and fix run: pnpm run lint:fix From ccbdc27f63bf94ce2185fae59196ae2ed5c35d86 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Wed, 15 Jan 2025 17:37:54 +0100 Subject: [PATCH 26/32] feat: add drift tools to langchain --- src/langchain/drift/create_user_account.ts | 38 ++++++++++++++ src/langchain/drift/create_vault.ts | 42 +++++++++++++++ src/langchain/drift/deposit_into_vault.ts | 37 +++++++++++++ .../drift/deposit_to_user_account.ts | 39 ++++++++++++++ src/langchain/drift/derive_vault_address.ts | 32 ++++++++++++ .../drift/does_user_have_drift_account.ts | 38 ++++++++++++++ .../drift/drift_user_account_info.ts | 29 +++++++++++ src/langchain/drift/index.ts | 15 ++++++ src/langchain/drift/request_withdrawal.ts | 37 +++++++++++++ src/langchain/drift/trade_delegated_vault.ts | 49 +++++++++++++++++ src/langchain/drift/trade_perp_account.ts | 42 +++++++++++++++ .../drift/update_drift_vault_delegate.ts | 37 +++++++++++++ src/langchain/drift/update_vault.ts | 52 +++++++++++++++++++ src/langchain/drift/vault_info.ts | 32 ++++++++++++ src/langchain/drift/withdraw_from_account.ts | 39 ++++++++++++++ src/langchain/drift/withdraw_from_vault.ts | 32 ++++++++++++ src/langchain/index.ts | 31 +++++++++++ 17 files changed, 621 insertions(+) create mode 100644 src/langchain/drift/create_user_account.ts create mode 100644 src/langchain/drift/create_vault.ts create mode 100644 src/langchain/drift/deposit_into_vault.ts create mode 100644 src/langchain/drift/deposit_to_user_account.ts create mode 100644 src/langchain/drift/derive_vault_address.ts create mode 100644 src/langchain/drift/does_user_have_drift_account.ts create mode 100644 src/langchain/drift/drift_user_account_info.ts create mode 100644 src/langchain/drift/index.ts create mode 100644 src/langchain/drift/request_withdrawal.ts create mode 100644 src/langchain/drift/trade_delegated_vault.ts create mode 100644 src/langchain/drift/trade_perp_account.ts create mode 100644 src/langchain/drift/update_drift_vault_delegate.ts create mode 100644 src/langchain/drift/update_vault.ts create mode 100644 src/langchain/drift/vault_info.ts create mode 100644 src/langchain/drift/withdraw_from_account.ts create mode 100644 src/langchain/drift/withdraw_from_vault.ts diff --git a/src/langchain/drift/create_user_account.ts b/src/langchain/drift/create_user_account.ts new file mode 100644 index 0000000..36f8ecf --- /dev/null +++ b/src/langchain/drift/create_user_account.ts @@ -0,0 +1,38 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaCreateDriftUserAccountTool extends Tool { + name = "create_drift_user_account"; + description = `Create a new user account with a deposit on Drift protocol. + + Inputs (JSON string): + - amount: number, amount of the token to deposit (required) + - symbol: string, symbol of the token to deposit (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const res = await this.solanaKit.createDriftUserAccount( + parsedInput.amount, + parsedInput.symbol, + ); + + return JSON.stringify({ + status: "success", + message: `User account created with ${parsedInput.amount} ${parsedInput.symbol} successfully deposited`, + account: res.account, + signature: res.txSignature, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "CREATE_DRIFT_USER_ACCOUNT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/create_vault.ts b/src/langchain/drift/create_vault.ts new file mode 100644 index 0000000..5ff62f2 --- /dev/null +++ b/src/langchain/drift/create_vault.ts @@ -0,0 +1,42 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaCreateDriftVaultTool extends Tool { + name = "create_drift_vault"; + description = `Create a new drift vault delegating the agents address as the owner. + + Inputs (JSON string): + - name: string, unique vault name (min 5 chars) + - marketName: string, market name in TOKEN-SPOT format + - redeemPeriod: number, days to wait before funds can be redeemed (min 1) + - maxTokens: number, maximum tokens vault can accommodate (min 100) + - minDepositAmount: number, minimum deposit amount + - managementFee: number, fee percentage for managing funds (max 20) + - profitShare: number, profit sharing percentage (max 90, default 5) + - hurdleRate: number, optional hurdle rate + - permissioned: boolean, whether vault has whitelist`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.createDriftVault(parsedInput); + + return JSON.stringify({ + status: "success", + message: "Drift vault created successfully", + vaultName: parsedInput.name, + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "CREATE_DRIFT_VAULT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/deposit_into_vault.ts b/src/langchain/drift/deposit_into_vault.ts new file mode 100644 index 0000000..689fba1 --- /dev/null +++ b/src/langchain/drift/deposit_into_vault.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaDepositIntoDriftVaultTool extends Tool { + name = "deposit_into_drift_vault"; + description = `Deposit funds into an existing drift vault. + + Inputs (JSON string): + - vaultAddress: string, address of the vault (required) + - amount: number, amount to deposit (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.depositIntoDriftVault( + parsedInput.amount, + parsedInput.vaultAddress, + ); + + return JSON.stringify({ + status: "success", + message: "Funds deposited successfully", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "DEPOSIT_INTO_VAULT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/deposit_to_user_account.ts b/src/langchain/drift/deposit_to_user_account.ts new file mode 100644 index 0000000..a9ecb43 --- /dev/null +++ b/src/langchain/drift/deposit_to_user_account.ts @@ -0,0 +1,39 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaDepositToDriftUserAccountTool extends Tool { + name = "deposit_to_drift_user_account"; + description = `Deposit funds into your drift user account. + + Inputs (JSON string): + - amount: number, amount to deposit (required) + - symbol: string, token symbol (required) + - repay: boolean, whether to repay borrowed funds (optional, default: false)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.depositToDriftUserAccount( + parsedInput.amount, + parsedInput.symbol, + parsedInput.repay, + ); + + return JSON.stringify({ + status: "success", + message: "Funds deposited successfully", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "DEPOSIT_TO_DRIFT_ACCOUNT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/derive_vault_address.ts b/src/langchain/drift/derive_vault_address.ts new file mode 100644 index 0000000..bbd3b8a --- /dev/null +++ b/src/langchain/drift/derive_vault_address.ts @@ -0,0 +1,32 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaDeriveVaultAddressTool extends Tool { + name = "derive_drift_vault_address"; + description = `Derive a drift vault address from the vault's name. + + Inputs (JSON string): + - name: string, name of the vault to derive the address of (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const address = await this.solanaKit.deriveDriftVaultAddress(input); + + return JSON.stringify({ + status: "success", + message: "Vault address derived successfully", + address, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "DERIVE_VAULT_ADDRESS_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/does_user_have_drift_account.ts b/src/langchain/drift/does_user_have_drift_account.ts new file mode 100644 index 0000000..7673b57 --- /dev/null +++ b/src/langchain/drift/does_user_have_drift_account.ts @@ -0,0 +1,38 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaCheckDriftAccountTool extends Tool { + name = "does_user_have_drift_account"; + description = `Check if a user has a Drift account. + + Inputs: No inputs required - checks the current user's account`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(_input: string): Promise { + try { + const res = await this.solanaKit.doesUserHaveDriftAccount(); + + if (!res.hasAccount) { + return JSON.stringify({ + status: "error", + message: "You do not have a Drift account", + }); + } + + return JSON.stringify({ + status: "success", + message: "Nice! You have a Drift account", + account: res.account, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "CHECK_DRIFT_ACCOUNT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/drift_user_account_info.ts b/src/langchain/drift/drift_user_account_info.ts new file mode 100644 index 0000000..191577a --- /dev/null +++ b/src/langchain/drift/drift_user_account_info.ts @@ -0,0 +1,29 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaDriftUserAccountInfoTool extends Tool { + name = "drift_user_account_info"; + description = `Get information about your drift account. + + Inputs: No inputs required - retrieves current user's account info`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(_input: string): Promise { + try { + const accountInfo = await this.solanaKit.driftUserAccountInfo(); + return JSON.stringify({ + status: "success", + data: accountInfo, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "DRIFT_ACCOUNT_INFO_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/index.ts b/src/langchain/drift/index.ts new file mode 100644 index 0000000..3c9a4c8 --- /dev/null +++ b/src/langchain/drift/index.ts @@ -0,0 +1,15 @@ +export * from "./create_user_account"; +export * from "./create_vault"; +export * from "./deposit_into_vault"; +export * from "./deposit_to_user_account"; +export * from "./derive_vault_address"; +export * from "./does_user_have_drift_account"; +export * from "./drift_user_account_info"; +export * from "./request_withdrawal"; +export * from "./trade_delegated_vault"; +export * from "./trade_perp_account"; +export * from "./update_drift_vault_delegate"; +export * from "./update_vault"; +export * from "./vault_info"; +export * from "./withdraw_from_account"; +export * from "./withdraw_from_vault"; diff --git a/src/langchain/drift/request_withdrawal.ts b/src/langchain/drift/request_withdrawal.ts new file mode 100644 index 0000000..507a31e --- /dev/null +++ b/src/langchain/drift/request_withdrawal.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaRequestDriftWithdrawalTool extends Tool { + name = "request_withdrawal_from_drift_vault"; + description = `Request a withdrawal from an existing drift vault. + + Inputs (JSON string): + - vaultAddress: string, vault address (required) + - amount: number, amount of shares to withdraw (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.requestWithdrawalFromDriftVault( + parsedInput.amount, + parsedInput.vaultAddress, + ); + + return JSON.stringify({ + status: "success", + message: "Withdrawal request successful", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "REQUEST_DRIFT_WITHDRAWAL_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/trade_delegated_vault.ts b/src/langchain/drift/trade_delegated_vault.ts new file mode 100644 index 0000000..131efd8 --- /dev/null +++ b/src/langchain/drift/trade_delegated_vault.ts @@ -0,0 +1,49 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaTradeDelegatedDriftVaultTool extends Tool { + name = "trade_delegated_drift_vault"; + description = `Carry out trades in a Drift vault. + + Inputs (JSON string): + - vaultAddress: string, address of the Drift vault + - amount: number, amount to trade + - symbol: string, symbol of the token to trade + - action: "long" | "short", trade direction + - type: "market" | "limit", order type + - price: number, optional limit price`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.tradeUsingDelegatedDriftVault( + parsedInput.vaultAddress, + parsedInput.amount, + parsedInput.symbol, + parsedInput.action, + parsedInput.type, + parsedInput.price, + ); + + return JSON.stringify({ + status: "success", + message: + parsedInput.type === "limit" + ? "Order placed successfully" + : "Trade successful", + transactionId: tx, + ...parsedInput, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "TRADE_DRIFT_VAULT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/trade_perp_account.ts b/src/langchain/drift/trade_perp_account.ts new file mode 100644 index 0000000..29f4ac1 --- /dev/null +++ b/src/langchain/drift/trade_perp_account.ts @@ -0,0 +1,42 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaTradeDriftPerpAccountTool extends Tool { + name = "trade_drift_perp_account"; + description = `Trade a perpetual account on Drift protocol. + + Inputs (JSON string): + - amount: number, amount to trade (required) + - symbol: string, token symbol (required) + - action: "long" | "short", trade direction (required) + - type: "market" | "limit", order type (required) + - price: number, required for limit orders`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const signature = await this.solanaKit.tradeUsingDriftPerpAccount( + parsedInput.amount, + parsedInput.symbol, + parsedInput.action, + parsedInput.type, + parsedInput.price, + ); + + return JSON.stringify({ + status: "success", + signature, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "TRADE_PERP_ACCOUNT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/update_drift_vault_delegate.ts b/src/langchain/drift/update_drift_vault_delegate.ts new file mode 100644 index 0000000..8608593 --- /dev/null +++ b/src/langchain/drift/update_drift_vault_delegate.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaUpdateDriftVaultDelegateTool extends Tool { + name = "update_drift_vault_delegate"; + description = `Update the delegate of a drift vault. + + Inputs (JSON string): + - vaultAddress: string, address of the vault (required) + - newDelegate: string, address of the new delegate (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.updateDriftVaultDelegate( + parsedInput.vaultAddress, + parsedInput.newDelegate, + ); + + return JSON.stringify({ + status: "success", + message: "Vault delegate updated successfully", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UPDATE_DRIFT_VAULT_DELEGATE_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/update_vault.ts b/src/langchain/drift/update_vault.ts new file mode 100644 index 0000000..608d963 --- /dev/null +++ b/src/langchain/drift/update_vault.ts @@ -0,0 +1,52 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaUpdateDriftVaultTool extends Tool { + name = "update_drift_vault"; + description = `Update an existing drift vault with new settings. + + Inputs (JSON string): + - vaultAddress: string, vault address (required) + - redeemPeriod: number, days until redemption (optional) + - maxTokens: number, maximum tokens allowed (optional) + - minDepositAmount: number, minimum deposit amount (optional) + - managementFee: number, management fee percentage (optional) + - profitShare: number, profit sharing percentage (optional) + - hurdleRate: number, hurdle rate (optional) + - permissioned: boolean, whitelist requirement (optional)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.updateDriftVault( + parsedInput.vaultAddress, + // @ts-expect-error - type mismatch + { + hurdleRate: parsedInput.hurdleRate, + maxTokens: parsedInput.maxTokens, + minDepositAmount: parsedInput.minDepositAmount, + profitShare: parsedInput.profitShare, + managementFee: parsedInput.managementFee, + permissioned: parsedInput.permissioned, + redeemPeriod: parsedInput.redeemPeriod, + }, + ); + + return JSON.stringify({ + status: "success", + message: "Drift vault parameters updated successfully", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UPDATE_DRIFT_VAULT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/vault_info.ts b/src/langchain/drift/vault_info.ts new file mode 100644 index 0000000..fc250e9 --- /dev/null +++ b/src/langchain/drift/vault_info.ts @@ -0,0 +1,32 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaDriftVaultInfoTool extends Tool { + name = "drift_vault_info"; + description = `Get information about a drift vault. + + Inputs (JSON string): + - vaultNameOrAddress: string, name or address of the vault (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const vaultInfo = await this.solanaKit.getDriftVaultInfo(input); + + return JSON.stringify({ + status: "success", + message: "Vault info retrieved successfully", + data: vaultInfo, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "DRIFT_VAULT_INFO_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/withdraw_from_account.ts b/src/langchain/drift/withdraw_from_account.ts new file mode 100644 index 0000000..ce76375 --- /dev/null +++ b/src/langchain/drift/withdraw_from_account.ts @@ -0,0 +1,39 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaWithdrawFromDriftAccountTool extends Tool { + name = "withdraw_from_drift_account"; + description = `Withdraw or borrow funds from your drift account. + + Inputs (JSON string): + - amount: number, amount to withdraw (required) + - symbol: string, token symbol (required) + - isBorrow: boolean, whether to borrow funds instead of withdrawing (optional, default: false)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.withdrawFromDriftAccount( + parsedInput.amount, + parsedInput.symbol, + parsedInput.isBorrow, + ); + + return JSON.stringify({ + status: "success", + message: "Funds withdrawn successfully", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "WITHDRAW_FROM_DRIFT_ACCOUNT_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/withdraw_from_vault.ts b/src/langchain/drift/withdraw_from_vault.ts new file mode 100644 index 0000000..1bace25 --- /dev/null +++ b/src/langchain/drift/withdraw_from_vault.ts @@ -0,0 +1,32 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; + +export class SolanaWithdrawFromDriftVaultTool extends Tool { + name = "withdraw_from_drift_vault"; + description = `Withdraw funds from a vault given the redemption time has elapsed. + + Inputs (JSON string): + - vaultAddress: string, vault address (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const tx = await this.solanaKit.withdrawFromDriftVault(input); + + return JSON.stringify({ + status: "success", + message: "Withdrawal successful", + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "WITHDRAW_FROM_DRIFT_VAULT_ERROR", + }); + } + } +} diff --git a/src/langchain/index.ts b/src/langchain/index.ts index a37bfa8..809c340 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -25,6 +25,7 @@ export * from "./sns"; export * from "./lightprotocol"; export * from "./squads"; export * from "./helius"; +export * from "./drift"; import { SolanaAgentKit } from "../agent"; import { @@ -98,6 +99,21 @@ import { SolanaDeleteHeliusWebhookTool, SolanaParseTransactionHeliusTool, SolanaGetAllAssetsByOwner, + SolanaCheckDriftAccountTool, + SolanaCreateDriftUserAccountTool, + SolanaCreateDriftVaultTool, + SolanaDepositIntoDriftVaultTool, + SolanaDepositToDriftUserAccountTool, + SolanaDeriveVaultAddressTool, + SolanaDriftUserAccountInfoTool, + SolanaDriftVaultInfoTool, + SolanaRequestDriftWithdrawalTool, + SolanaTradeDelegatedDriftVaultTool, + SolanaTradeDriftPerpAccountTool, + SolanaUpdateDriftVaultDelegateTool, + SolanaUpdateDriftVaultTool, + SolanaWithdrawFromDriftAccountTool, + SolanaWithdrawFromDriftVaultTool, } from "./index"; export function createSolanaTools(solanaKit: SolanaAgentKit) { @@ -177,5 +193,20 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaHeliusWebhookTool(solanaKit), new SolanaGetHeliusWebhookTool(solanaKit), new SolanaDeleteHeliusWebhookTool(solanaKit), + new SolanaCreateDriftUserAccountTool(solanaKit), + new SolanaCreateDriftVaultTool(solanaKit), + new SolanaDepositIntoDriftVaultTool(solanaKit), + new SolanaDepositToDriftUserAccountTool(solanaKit), + new SolanaDeriveVaultAddressTool(solanaKit), + new SolanaCheckDriftAccountTool(solanaKit), + new SolanaDriftUserAccountInfoTool(solanaKit), + new SolanaRequestDriftWithdrawalTool(solanaKit), + new SolanaTradeDelegatedDriftVaultTool(solanaKit), + new SolanaTradeDriftPerpAccountTool(solanaKit), + new SolanaUpdateDriftVaultDelegateTool(solanaKit), + new SolanaUpdateDriftVaultTool(solanaKit), + new SolanaDriftVaultInfoTool(solanaKit), + new SolanaWithdrawFromDriftAccountTool(solanaKit), + new SolanaWithdrawFromDriftVaultTool(solanaKit), ]; } From 97e96730896551e64f69b16543816c219d3c17fe Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Thu, 16 Jan 2025 19:39:47 +0100 Subject: [PATCH 27/32] feat: add more drift actions --- src/actions/drift/availableMarkets.ts | 55 ++++ src/actions/drift/createDriftUserAccount.ts | 7 +- src/actions/drift/createVault.ts | 9 +- src/actions/drift/depositIntoVault.ts | 4 +- .../drift/depositToDriftUserAccount.ts | 2 +- .../requestUnstakeFromDriftInsuranceFund.ts | 62 ++++ .../drift/requestWithdrawalFromVault.ts | 4 +- .../drift/stakeToDriftInsuranceFund.ts | 59 ++++ src/actions/drift/swapSpotToken.ts | 76 +++++ src/actions/drift/tradeDelegatedDriftVault.ts | 13 +- src/actions/drift/tradePerpAccount.ts | 21 +- .../drift/unstakeFromDriftInsuranceFund.ts | 51 ++++ src/actions/drift/updateDriftVaultDelegate.ts | 4 +- src/actions/drift/updateVault.ts | 31 +- src/actions/drift/withdrawFromDriftAccount.ts | 2 +- src/actions/drift/withdrawFromVault.ts | 2 +- src/actions/index.ts | 11 + src/agent/index.ts | 50 ++++ .../request_unstake_from_insurance_fund.ts | 37 +++ .../drift/stake_to_insurance_fund.ts | 37 +++ src/langchain/drift/swap_spot_token.ts | 37 +++ .../drift/unstake_from_insurance_fund.ts | 32 +++ src/tools/drift/drift.ts | 270 +++++++++++++++++- src/tools/drift/drift_vault.ts | 30 +- 24 files changed, 863 insertions(+), 43 deletions(-) create mode 100644 src/actions/drift/availableMarkets.ts create mode 100644 src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts create mode 100644 src/actions/drift/stakeToDriftInsuranceFund.ts create mode 100644 src/actions/drift/swapSpotToken.ts create mode 100644 src/actions/drift/unstakeFromDriftInsuranceFund.ts create mode 100644 src/langchain/drift/request_unstake_from_insurance_fund.ts create mode 100644 src/langchain/drift/stake_to_insurance_fund.ts create mode 100644 src/langchain/drift/swap_spot_token.ts create mode 100644 src/langchain/drift/unstake_from_insurance_fund.ts diff --git a/src/actions/drift/availableMarkets.ts b/src/actions/drift/availableMarkets.ts new file mode 100644 index 0000000..85bd174 --- /dev/null +++ b/src/actions/drift/availableMarkets.ts @@ -0,0 +1,55 @@ +import { MainnetSpotMarkets } from "@drift-labs/sdk"; +import type { Action } from "../../types"; +import { z } from "zod"; +import { + getAvailableDriftPerpMarkets, + getAvailableDriftSpotMarkets, +} from "../../tools"; + +const availableDriftMarketsAction: Action = { + name: "AVAILABLE_DRIFT_MARKETS", + description: "Get a list of available drift markets", + similes: [ + "get drift markets", + "drift markets", + "available drift markets", + "get available drift perp markets", + "get available spot markets on drift", + ], + examples: [ + [ + { + input: { + marketType: "spot", + }, + output: { + status: "success", + message: `The list of available spot markets are ${MainnetSpotMarkets.map((v) => v.symbol).join(", ")}`, + data: MainnetSpotMarkets, + }, + explanation: "Get the list of available spot markets/tokens on drift", + }, + ], + ], + schema: z.object({ + marketType: z + .enum(["spot", "perp"]) + .describe("Type of market to get") + .optional(), + }), + handler: async (agent, input) => { + switch (input.marketType) { + case "perp": + return getAvailableDriftPerpMarkets(); + case "spot": + return getAvailableDriftSpotMarkets(); + default: + return { + spot: getAvailableDriftSpotMarkets(), + perp: getAvailableDriftPerpMarkets(), + }; + } + }, +}; + +export default availableDriftMarketsAction; diff --git a/src/actions/drift/createDriftUserAccount.ts b/src/actions/drift/createDriftUserAccount.ts index 32c62ef..43638c3 100644 --- a/src/actions/drift/createDriftUserAccount.ts +++ b/src/actions/drift/createDriftUserAccount.ts @@ -27,7 +27,12 @@ const createDriftUserAccountAction: Action = { ], ], schema: z.object({ - amount: z.number().positive().describe("Amount of the token to deposit"), + amount: z + .number() + .positive() + .describe( + "Amount of the token to deposit. In normal token amounts e.g 50 SOL, 100 USDC, etc", + ), symbol: z.string().describe("Symbol of the token to deposit"), }), handler: async (agent, input) => { diff --git a/src/actions/drift/createVault.ts b/src/actions/drift/createVault.ts index 26ac59b..e09e07d 100644 --- a/src/actions/drift/createVault.ts +++ b/src/actions/drift/createVault.ts @@ -53,9 +53,14 @@ const createDriftVaultAction: Action = { .int() .min(100, "Max tokens must be at least 100") .describe( - "The maximum amount of tokens the vault will be accomodating. For example some vaults have a cap at 10 million USDC", + "The maximum amount of tokens the vault will be accomodating. For example some vaults have a cap at 10 million USDC. This amount should be normal token amounts e.g 50 SOL, 100 USDC, etc", + ), + minDepositAmount: z + .number() + .positive() + .describe( + "Minimum deposit amount in normal token values e.g 50 SOL, 100 USDC, etc", ), - minDepositAmount: z.number().positive().describe("Minimum deposit amount"), managementFee: z .number() .positive() diff --git a/src/actions/drift/depositIntoVault.ts b/src/actions/drift/depositIntoVault.ts index eddb9f0..ca14c53 100644 --- a/src/actions/drift/depositIntoVault.ts +++ b/src/actions/drift/depositIntoVault.ts @@ -28,7 +28,9 @@ const depositIntoDriftVaultAction: Action = { amount: z .number() .positive() - .describe("The amount in tokens you'd like to deposit into the vault"), + .describe( + "The amount in tokens you'd like to deposit into the vault in normal token amounts e.g 50 SOL, 100 USDC, etc", + ), }), handler: async (agent, input) => { try { diff --git a/src/actions/drift/depositToDriftUserAccount.ts b/src/actions/drift/depositToDriftUserAccount.ts index af152c3..3e0dc7b 100644 --- a/src/actions/drift/depositToDriftUserAccount.ts +++ b/src/actions/drift/depositToDriftUserAccount.ts @@ -34,7 +34,7 @@ const depositToDriftUserAccountAction: Action = { .number() .positive() .describe( - "The amount in tokens you'd like to deposit into your drift user account", + "The amount in tokens you'd like to deposit into your drift user account in normal token amounts e.g 50 SOL, 100 USDC, etc", ), symbol: z .string() diff --git a/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts b/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts new file mode 100644 index 0000000..fc1b645 --- /dev/null +++ b/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { requestUnstakeFromDriftInsuranceFund } from "../../tools"; + +const requestUnstakeFromDriftInsuranceFundAction: Action = { + name: "REQUEST_UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ACTION", + description: + "Request to unstake a certain amount of a token from the Drift Insurance Fund", + similes: [ + "request an unstake from the drift insurance fund", + "unstake an amount from the drift insurance fund", + "ask to unstake a certain amount from the drift insurance fund", + ], + examples: [ + [ + { + input: { + amount: 100, + symbol: "SOL", + }, + output: { + status: "success", + message: "Requested to unstake 100 SOL from the Drift Insurance Fund", + signature: "4FdasklhiIHyOI", + }, + explanation: "Request to unstake 100 SOL from the Drift Insurance Fund", + }, + ], + ], + schema: z.object({ + amount: z + .number() + .positive() + .describe("Amount to unstake in normal units e.g 50 === 50 SOL"), + symbol: z.string().describe("Symbol of the token to unstake"), + }), + handler: async (agent, input) => { + try { + const tx = await requestUnstakeFromDriftInsuranceFund( + agent, + input.amount, + input.symbol, + ); + + return { + status: "success", + message: `Requested to unstake ${input.amount} ${input.symbol} from the Drift Insurance Fund`, + data: { + signature: tx, + }, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error error is not a string + message: e.message, + }; + } + }, +}; + +export default requestUnstakeFromDriftInsuranceFundAction; diff --git a/src/actions/drift/requestWithdrawalFromVault.ts b/src/actions/drift/requestWithdrawalFromVault.ts index df6939c..9dd1641 100644 --- a/src/actions/drift/requestWithdrawalFromVault.ts +++ b/src/actions/drift/requestWithdrawalFromVault.ts @@ -29,7 +29,9 @@ const requestWithdrawalFromVaultAction: Action = { amount: z .number() .positive() - .describe("Amount of shares you would like to withdraw from the vault"), + .describe( + "Amount of shares you would like to withdraw from the vault in normal token amounts e.g 50 SOL, 100 USDC, etc", + ), }), handler: async (agent: SolanaAgentKit, input) => { try { diff --git a/src/actions/drift/stakeToDriftInsuranceFund.ts b/src/actions/drift/stakeToDriftInsuranceFund.ts new file mode 100644 index 0000000..39cf179 --- /dev/null +++ b/src/actions/drift/stakeToDriftInsuranceFund.ts @@ -0,0 +1,59 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { stakeToDriftInsuranceFund } from "../../tools"; + +const stakeToDriftInsuranceFundAction: Action = { + name: "STAKE_TO_DRIFT_INSURANCE_FUND_ACTION", + description: "Stake a token to Drift Insurance Fund", + similes: ["Stake a token to Drift Insurance Fund"], + examples: [ + [ + { + input: { + amount: 100, + symbol: "SOL", + }, + output: { + status: "success", + message: "Staked 100 SOL to the Drift Insurance Fund", + data: { + signature: "signature", + }, + }, + explanation: "Stake 100 SOL to the Drift Insurance Fund", + }, + ], + ], + schema: z.object({ + amount: z + .number() + .positive() + .describe("Amount to stake in normal units e.g 50 === 50 SOL"), + symbol: z.string().describe("Symbol of the token stake"), + }), + handler: async (agent, input) => { + try { + const tx = await stakeToDriftInsuranceFund( + agent, + input.amount, + input.symbol, + ); + + return { + status: "sucess", + message: `Staked ${input.amount} ${input.symbol} to the Drift Insurance Fund`, + data: { + signature: tx, + }, + }; + } catch (error) { + return { + status: "error", + // @ts-expect-error error is not a string + message: error.message, + }; + } + }, +}; + +export default stakeToDriftInsuranceFundAction; diff --git a/src/actions/drift/swapSpotToken.ts b/src/actions/drift/swapSpotToken.ts new file mode 100644 index 0000000..a076cb8 --- /dev/null +++ b/src/actions/drift/swapSpotToken.ts @@ -0,0 +1,76 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { swapSpotToken } from "../../tools"; + +const driftSpotTokenSwapAction: Action = { + name: "DRIFT_SPOT_TOKEN_SWAP_ACTION", + description: "Swap a spot token for another spot token on Drift", + similes: [ + "swap a token for another token on drift", + "exchange a token for another token on drift", + "trade a token for another token on drift", + ], + examples: [ + [ + { + input: { + fromSymbol: "SOL", + toSymbol: "USDC", + fromAmount: 100, + }, + output: { + status: "success", + message: "Swapped 100 SOL for USDC on Drift", + signature: "4FdasklhiIHyOI", + }, + explanation: "Swap 100 SOL for USDC on Drift", + }, + ], + ], + schema: z.object({ + fromSymbol: z.string().describe("Symbol of the token to swap from"), + toSymbol: z.string().describe("Symbol of the token to swap to"), + fromAmount: z + .number() + .positive() + .describe("Amount to swap from in normal units e.g 50 === 50 SOL") + .optional(), + toAmount: z + .number() + .positive() + .describe("Amount to swap to in normal units e.g 5000 === 5000 USDC") + .optional(), + slippage: z + .number() + .positive() + .describe("Slippage tolerance in percentage e.g 0.5 === 0.5%") + .optional(), + }), + handler: async (agent, input) => { + try { + const tx = await swapSpotToken(agent, { + fromSymbol: input.fromSymbol, + toSymbol: input.toSymbol, + fromAmount: input.fromAmount, + toAmount: input.toAmount, + slippage: input.slippage, + }); + + return { + status: "success", + message: `Swapped ${input.fromAmount} ${input.fromSymbol} for ${input.toAmount} ${input.toSymbol} on Drift`, + data: { + signature: tx, + }, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error error is not a string + message: e.message, + }; + } + }, +}; + +export default driftSpotTokenSwapAction; diff --git a/src/actions/drift/tradeDelegatedDriftVault.ts b/src/actions/drift/tradeDelegatedDriftVault.ts index c85d8b3..5d28a84 100644 --- a/src/actions/drift/tradeDelegatedDriftVault.ts +++ b/src/actions/drift/tradeDelegatedDriftVault.ts @@ -64,11 +64,20 @@ const tradeDelegatedDriftVaultAction: Action = { ], schema: z.object({ vaultAddress: z.string().describe("Address of the Drift vault to trade in"), - amount: z.number().positive().describe("Amount to trade"), + amount: z + .number() + .positive() + .describe( + "Amount to trade in normal token amounts e.g 50 SOL, 100 USDC, etc", + ), symbol: z.string().describe("Symbol of the token to trade"), action: z.enum(["long", "short"]).describe("Trade action - long or short"), type: z.enum(["market", "limit"]).describe("Trade type - market or limit"), - price: z.number().positive().optional().describe("Price for limit order"), + price: z + .number() + .positive() + .optional() + .describe("USD price for limit order"), }), handler: async (agent: SolanaAgentKit, input) => { try { diff --git a/src/actions/drift/tradePerpAccount.ts b/src/actions/drift/tradePerpAccount.ts index ae1db7e..15a53b4 100644 --- a/src/actions/drift/tradePerpAccount.ts +++ b/src/actions/drift/tradePerpAccount.ts @@ -46,14 +46,27 @@ export const tradeDriftPerpAccountAction: Action = { ], ], schema: z.object({ - amount: z.number().positive(), + amount: z + .number() + .positive() + .describe( + "The amount of the token to trade in normal token amounts e.g 50 SOL, 100 USDC", + ), symbol: z .string() .toUpperCase() .describe("Symbol of the token to open a position on "), - action: z.enum(["long", "short"]), - type: z.enum(["market", "limit"]), - price: z.number().positive().optional(), + action: z + .enum(["long", "short"]) + .describe( + "The action you would like to carry out whether it be a long or a short", + ), + type: z + .enum(["market", "limit"]) + .describe( + "The type of trade you would like to open, market or limit order", + ), + price: z.number().positive().optional().describe("USD price of the token"), }), handler: async (agent, input) => { try { diff --git a/src/actions/drift/unstakeFromDriftInsuranceFund.ts b/src/actions/drift/unstakeFromDriftInsuranceFund.ts new file mode 100644 index 0000000..4d9516e --- /dev/null +++ b/src/actions/drift/unstakeFromDriftInsuranceFund.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { unstakeFromDriftInsuranceFund } from "../../tools"; + +const unstakeFromDriftInsuranceFundAction: Action = { + name: "UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ACTION", + description: + "Unstake requested unstake amount from the Drift Insurance fund once the cool period has elapsed", + similes: [ + "unstake from the drift insurance fund", + "withdraw from the drift insurance fund", + "take out funds from the drift insurance fund", + ], + examples: [ + [ + { + input: { + symbol: "SOL", + }, + output: { + status: "success", + message: "Unstaked your SOL from the Drift Insurance Fund", + signature: "4FdasklhiIHyOI", + }, + explanation: "Unstake SOL from the Drift Insurance Fund", + }, + ], + ], + schema: z.object({ + symbol: z.string().describe("Symbol of the token to unstake"), + }), + handler: async (agent, input) => { + try { + const tx = await unstakeFromDriftInsuranceFund(agent, input.symbol); + + return { + status: "success", + message: `Unstaked your ${input.symbol} from the Drift Insurance Fund`, + signature: tx, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error error is not a string + message: e.message, + }; + } + }, +}; + +export default unstakeFromDriftInsuranceFundAction; diff --git a/src/actions/drift/updateDriftVaultDelegate.ts b/src/actions/drift/updateDriftVaultDelegate.ts index defc7a6..d203e0d 100644 --- a/src/actions/drift/updateDriftVaultDelegate.ts +++ b/src/actions/drift/updateDriftVaultDelegate.ts @@ -24,8 +24,8 @@ const updateDriftVaultDelegateAction: Action = { ], ], schema: z.object({ - vaultAddress: z.string(), - newDelegate: z.string(), + vaultAddress: z.string().describe("vault's address"), + newDelegate: z.string().describe("new address to delegate the vault to"), }), handler: async (agent, input) => { try { diff --git a/src/actions/drift/updateVault.ts b/src/actions/drift/updateVault.ts index 4d0f66e..2d0abed 100644 --- a/src/actions/drift/updateVault.ts +++ b/src/actions/drift/updateVault.ts @@ -41,16 +41,35 @@ const updateDriftVaultAction: Action = { redeemPeriod: z .number() .int() - .min(1, "Redeem period must be at least 1") + .min(1, "Redeem period must be at least 1 day") .optional(), maxTokens: z .number() .int() - .min(100, "Max tokens must be at least 100") - .optional(), - minDepositAmount: z.number().positive().optional(), - managementFee: z.number().positive().max(20).optional(), - profitShare: z.number().positive().max(90).optional(), + .min(100, "Max tokens must be at least be 100 units") + .optional() + .describe( + "The maximum number of tokens the vault is willing to accept and manage", + ), + minDepositAmount: z + .number() + .positive() + .optional() + .describe( + "The minimum amount that is allowed to be deposited into the vault in normal token amounts e.g 10 USDC", + ), + managementFee: z + .number() + .positive() + .max(20) + .optional() + .describe("The percentage fee the vault takes for asset management"), + profitShare: z + .number() + .positive() + .max(90) + .optional() + .describe("Profit share in percentage e.g 2 === 2%"), handleRate: z.number().optional(), permissioned: z .boolean() diff --git a/src/actions/drift/withdrawFromDriftAccount.ts b/src/actions/drift/withdrawFromDriftAccount.ts index 00d72b6..693a294 100644 --- a/src/actions/drift/withdrawFromDriftAccount.ts +++ b/src/actions/drift/withdrawFromDriftAccount.ts @@ -36,7 +36,7 @@ const withdrawFromDriftAccountAction: Action = { .number() .positive() .describe( - "The amount in tokens you'd like to withdraw from your drift account", + "The amount in tokens you'd like to withdraw from your drift account in normal token amounts, e.g 50 SOL, 100 USDC, etc", ), symbol: z .string() diff --git a/src/actions/drift/withdrawFromVault.ts b/src/actions/drift/withdrawFromVault.ts index b6007f2..4b4318b 100644 --- a/src/actions/drift/withdrawFromVault.ts +++ b/src/actions/drift/withdrawFromVault.ts @@ -25,7 +25,7 @@ const withdrawFromVaultAction: Action = { ], ], schema: z.object({ - vaultAddress: z.string(), + vaultAddress: z.string().describe("Vault's address"), }), handler: async (agent: SolanaAgentKit, input) => { try { diff --git a/src/actions/index.ts b/src/actions/index.ts index 29cf233..5b4324e 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -59,6 +59,11 @@ import withdrawFromDriftAccountAction from "./drift/withdrawFromDriftAccount"; import driftUserAccountInfoAction from "./drift/driftUserAccountInfo"; import deriveDriftVaultAddressAction from "./drift/deriveVaultAddress"; import updateDriftVaultDelegateAction from "./drift/updateDriftVaultDelegate"; +import availableDriftMarketsAction from "./drift/availableMarkets"; +import stakeToDriftInsuranceFundAction from "./drift/stakeToDriftInsuranceFund"; +import requestUnstakeFromDriftInsuranceFundAction from "./drift/requestUnstakeFromDriftInsuranceFund"; +import unstakeFromDriftInsuranceFundAction from "./drift/unstakeFromDriftInsuranceFund"; +import driftSpotTokenSwapAction from "./drift/swapSpotToken"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -123,6 +128,12 @@ export const ACTIONS = { DRIFT_USER_ACCOUNT_INFO_ACTION: driftUserAccountInfoAction, DERIVE_DRIFT_VAULT_ADDRESS_ACTION: deriveDriftVaultAddressAction, UPDATE_DRIFT_VAULT_DELEGATE_ACTION: updateDriftVaultDelegateAction, + AVAILABLE_DRIFT_MARKETS_ACTION: availableDriftMarketsAction, + STAKE_TO_DRIFT_INSURANCE_FUND_ACTION: stakeToDriftInsuranceFundAction, + REQUEST_UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ACTION: + requestUnstakeFromDriftInsuranceFundAction, + UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ACTION: unstakeFromDriftInsuranceFundAction, + DRIFT_SPOT_TOKEN_SWAP_ACTION: driftSpotTokenSwapAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/agent/index.ts b/src/agent/index.ts index d087931..0f6c834 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -98,6 +98,12 @@ import { withdrawFromDriftVault, updateVaultDelegate, get_token_balance, + getAvailableDriftSpotMarkets, + getAvailableDriftPerpMarkets, + stakeToDriftInsuranceFund, + requestUnstakeFromDriftInsuranceFund, + unstakeFromDriftInsuranceFund, + swapSpotToken, } from "../tools"; import { Config, @@ -821,4 +827,48 @@ export class SolanaAgentKit { async updateDriftVaultDelegate(vaultAddress: string, delegate: string) { return await updateVaultDelegate(this, vaultAddress, delegate); } + getAvailableDriftMarkets(type?: "spot" | "perp") { + switch (type) { + case "spot": + return getAvailableDriftSpotMarkets(); + case "perp": + return getAvailableDriftPerpMarkets(); + default: + return { + spot: getAvailableDriftSpotMarkets(), + perp: getAvailableDriftPerpMarkets(), + }; + } + } + async stakeToDriftInsuranceFund(amount: number, symbol: string) { + return await stakeToDriftInsuranceFund(this, amount, symbol); + } + async requestUnstakeFromDriftInsuranceFund(amount: number, symbol: string) { + return await requestUnstakeFromDriftInsuranceFund(this, amount, symbol); + } + async unstakeFromDriftInsuranceFund(symbol: string) { + return await unstakeFromDriftInsuranceFund(this, symbol); + } + async driftSpotTokenSwap( + params: { + fromSymbol: string; + toSymbol: string; + slippage?: number; + } & ( + | { + toAmount: number; + } + | { fromAmount: number } + ), + ) { + return await swapSpotToken(this, { + fromSymbol: params.fromSymbol, + toSymbol: params.toSymbol, + // @ts-expect-error - fromAmount and toAmount are mutually exclusive + fromAmount: params.fromAmount, + // @ts-expect-error - fromAmount and toAmount are mutually exclusive + toAmount: params.toAmount, + slippage: params.slippage, + }); + } } diff --git a/src/langchain/drift/request_unstake_from_insurance_fund.ts b/src/langchain/drift/request_unstake_from_insurance_fund.ts new file mode 100644 index 0000000..edeb630 --- /dev/null +++ b/src/langchain/drift/request_unstake_from_insurance_fund.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaRequestUnstakeFromDriftInsuranceFundTool extends Tool { + name = "request_unstake_from_drift_insurance_fund"; + description = `Request to unstake tokens from Drift Insurance Fund. + + Inputs (JSON string): + - amount: number, amount to unstake (required) + - symbol: string, token symbol (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.requestUnstakeFromDriftInsuranceFund( + parsedInput.amount, + parsedInput.symbol, + ); + + return JSON.stringify({ + status: "success", + message: `Requested unstake of ${parsedInput.amount} ${parsedInput.symbol} from the Drift Insurance Fund`, + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "REQUEST_UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/stake_to_insurance_fund.ts b/src/langchain/drift/stake_to_insurance_fund.ts new file mode 100644 index 0000000..09cc363 --- /dev/null +++ b/src/langchain/drift/stake_to_insurance_fund.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaStakeToDriftInsuranceFundTool extends Tool { + name = "stake_to_drift_insurance_fund"; + description = `Stake a token to Drift Insurance Fund. + + Inputs (JSON string): + - amount: number, amount to stake (required) + - symbol: string, token symbol (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.stakeToDriftInsuranceFund( + parsedInput.amount, + parsedInput.symbol, + ); + + return JSON.stringify({ + status: "success", + message: `Staked ${parsedInput.amount} ${parsedInput.symbol} to the Drift Insurance Fund`, + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "STAKE_TO_DRIFT_INSURANCE_FUND_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/swap_spot_token.ts b/src/langchain/drift/swap_spot_token.ts new file mode 100644 index 0000000..f5f7314 --- /dev/null +++ b/src/langchain/drift/swap_spot_token.ts @@ -0,0 +1,37 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaDriftSpotTokenSwapTool extends Tool { + name = "drift_spot_token_swap"; + description = `Swap spot tokens on Drift protocol. + + Inputs (JSON string): + - fromSymbol: string, symbol of token to swap from (required) + - toSymbol: string, symbol of token to swap to (required) + - fromAmount: number, amount to swap from (optional) required if toAmount is not provided + - toAmount: number, amount to swap to (optional) required if fromAmount is not provided + - slippage: number, slippage tolerance in percentage (optional)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const tx = await this.solanaKit.driftSpotTokenSwap(parsedInput); + + return JSON.stringify({ + status: "success", + message: `Swapped ${parsedInput.fromAmount} ${parsedInput.fromSymbol} for ${parsedInput.toSymbol}`, + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "DRIFT_SPOT_TOKEN_SWAP_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/unstake_from_insurance_fund.ts b/src/langchain/drift/unstake_from_insurance_fund.ts new file mode 100644 index 0000000..b610aae --- /dev/null +++ b/src/langchain/drift/unstake_from_insurance_fund.ts @@ -0,0 +1,32 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaUnstakeFromDriftInsuranceFundTool extends Tool { + name = "unstake_from_drift_insurance_fund"; + description = `Unstake tokens from Drift Insurance Fund after request period has elapsed. + + Inputs (JSON string): + - symbol: string, token symbol (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const tx = await this.solanaKit.unstakeFromDriftInsuranceFund(input); + + return JSON.stringify({ + status: "success", + message: `Unstaked ${input} from the Drift Insurance Fund`, + signature: tx, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ERROR", + }); + } + } +} diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 1a8b4a9..57999f5 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -7,6 +7,8 @@ import { getLimitOrderParams, getMarketOrderParams, getUserAccountPublicKeySync, + JupiterClient, + MainnetPerpMarkets, MainnetSpotMarkets, numberToSafeBN, PositionDirection, @@ -115,7 +117,10 @@ export async function createDriftUserAccount( ); if (!token) { - throw new Error(`Token with symbol ${symbol} not found`); + throw new Error(`Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")} + `); } if (!userAccountExists) { @@ -171,7 +176,11 @@ export async function depositToDriftUserAccount( ); if (!token) { - throw new Error(`Token with symbol ${symbol} not found`); + throw new Error( + `Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); } if (!userAccountExists) { @@ -237,7 +246,11 @@ export async function withdrawFromDriftUserAccount( ); if (!token) { - throw new Error(`Token with symbol ${symbol} not found`); + throw new Error( + `Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); } const withdrawAmount = numberToSafeBN(amount, token.precision); @@ -313,7 +326,11 @@ export async function driftPerpTrade( ); if (!market) { - throw new Error(`Token with symbol ${params.symbol} not found`); + throw new Error( + `Token with symbol ${params.symbol} not found. Here's a list of available perp markets: ${MainnetPerpMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); } const baseAssetPrice = driftClient.getOracleDataForPerpMarket( @@ -435,10 +452,9 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { })); const spotPositions = account.spotPositions.map((pos) => ({ ...pos, - scaledBalance: convertToNumber(pos.scaledBalance, BASE_PRECISION), - cumulativeDeposits: convertToNumber( - pos.cumulativeDeposits, - BASE_PRECISION, + availableBalance: convertToNumber( + pos.scaledBalance, + MainnetSpotMarkets[pos.marketIndex].precision, ), symbol: MainnetSpotMarkets.find((v) => v.marketIndex === pos.marketIndex) ?.symbol, @@ -448,8 +464,6 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { ...account, name: account.name, authority: account.authority, - totalDeposits: `$${convertToNumber(account.totalDeposits, QUOTE_PRECISION)}`, - totalWithdraws: `$${convertToNumber(account.totalWithdraws, QUOTE_PRECISION)}`, settledPerpPnl: `$${convertToNumber(account.settledPerpPnl, QUOTE_PRECISION)}`, lastActiveSlot: account.lastActiveSlot.toNumber(), perpPositions, @@ -460,3 +474,239 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { throw new Error(`Failed to check user account: ${e.message}`); } } + +/** + * Get available spot markets on drift protocol + */ +export function getAvailableDriftSpotMarkets() { + return MainnetSpotMarkets; +} + +/** + * Get available perp markets on drift protocol + */ +export function getAvailableDriftPerpMarkets() { + return MainnetPerpMarkets; +} + +/** + * Stake a token to the drift insurance fund + * @param agent + * @param amount + * @param symbol + */ +export async function stakeToDriftInsuranceFund( + agent: SolanaAgentKit, + amount: number, + symbol: string, +) { + try { + const { cleanUp, driftClient } = await initClients(agent); + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error( + `Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + const signature = await driftClient.addInsuranceFundStake({ + amount: numberToSafeBN(amount, token.precision), + marketIndex: token.marketIndex, + collateralAccountPublicKey: getAssociatedTokenAddressSync( + token.mint, + agent.wallet.publicKey, + ), + txParams: { + computeUnitsPrice: 0.000002 * 1000000 * 1000000, + }, + }); + + await cleanUp(); + return signature; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to get APYs: ${e.message}`); + } +} + +/** + * Request an unstake from the drift insurance fund + * @param agent + * @param amount + * @param symbol + */ +export async function requestUnstakeFromDriftInsuranceFund( + agent: SolanaAgentKit, + amount: number, + symbol: string, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error( + `Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + const signature = await driftClient.requestRemoveInsuranceFundStake( + token.marketIndex, + numberToSafeBN(amount, token.precision), + { computeUnitsPrice: 0.000002 * 1000000 * 1000000 }, + ); + + await cleanUp(); + return signature; + } catch (e) { + // @ts-expect-error error message is a string + throw new Error(`Failed to unstake from insurance fund: ${e.message}`); + } +} + +/** + * Unstake requested funds from the drift insurance fund once cool down period is elapsed + * @param agent + * @param symbol + */ +export async function unstakeFromDriftInsuranceFund( + agent: SolanaAgentKit, + symbol: string, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error( + `Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + const signature = await driftClient.removeInsuranceFundStake( + token.marketIndex, + getAssociatedTokenAddressSync(token.mint, agent.wallet.publicKey), + { + computeUnitsPrice: 0.000002 * 1000000 * 1000000, + }, + ); + + await cleanUp(); + return signature; + } catch (e) { + // @ts-expect-error error message is a string + throw new Error(`Failed to unstake from insurance fund: ${e.message}`); + } +} + +/** + * Swap a spot token for another on drift + * @param agent + * @param params + * @param params.fromSymbol symbol of the token to deposit + * @param params.toSymbol symbol of the token to receive + * @param params.fromAmount amount of the token to deposit + * @param params.toAmount amount of the token to receive + */ +export async function swapSpotToken( + agent: SolanaAgentKit, + params: { + fromSymbol: string; + toSymbol: string; + slippage?: number | undefined; + } & ( + | { + fromAmount: number; + } + | { + toAmount: number; + } + ), +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const fromToken = MainnetSpotMarkets.find( + (v) => v.symbol === params.fromSymbol.toUpperCase(), + ); + const toToken = MainnetSpotMarkets.find( + (v) => v.symbol === params.toSymbol.toUpperCase(), + ); + + if (!fromToken) { + throw new Error( + `Token with symbol ${params.fromSymbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + if (!toToken) { + throw new Error( + `Token with symbol ${params.toSymbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + let txSig: string; + + // @ts-expect-error - false undefined type conflict + if (params.fromAmount) { + const jupiterClient = new JupiterClient({ connection: agent.connection }); + // @ts-expect-error - false undefined type conflict + const fromAmount = numberToSafeBN(params.fromAmount, fromToken.precision); + const signature = await driftClient.swap({ + amount: fromAmount, + inMarketIndex: fromToken.marketIndex, + outMarketIndex: toToken.marketIndex, + jupiterClient: jupiterClient, + slippageBps: params.slippage ?? 100, + swapMode: "ExactIn", + }); + + txSig = signature; + } + + // @ts-expect-error - false undefined type conflict + if (params.toAmount) { + const jupiterClient = new JupiterClient({ connection: agent.connection }); + // @ts-expect-error - false undefined type conflict + const toAmount = numberToSafeBN(params.toAmount, toToken.precision); + const signature = await driftClient.swap({ + amount: toAmount, + inMarketIndex: toToken.marketIndex, + outMarketIndex: fromToken.marketIndex, + jupiterClient: jupiterClient, + slippageBps: params.slippage ?? 100, + swapMode: "ExactOut", + }); + + txSig = signature; + } + + await cleanUp(); + + // @ts-expect-error - false use before assignment + if (txSig) { + return txSig; + } + + throw new Error("Either fromAmount or toAmount must be provided"); + } catch (e) { + // @ts-expect-error error message is a string + throw new Error(`Failed to swap token: ${e.message}`); + } +} diff --git a/src/tools/drift/drift_vault.ts b/src/tools/drift/drift_vault.ts index feb23f1..c8d1214 100644 --- a/src/tools/drift/drift_vault.ts +++ b/src/tools/drift/drift_vault.ts @@ -37,14 +37,18 @@ export function getMarketIndexAndType(name: `${string}-${string}`) { if (type === "PERP") { const token = MainnetPerpMarkets.find((v) => v.baseAssetSymbol === symbol); if (!token) { - throw new Error("Drift doesn't have that market"); + throw new Error( + `Drift doesn't have that market. Here's a list of available perp markets: ${MainnetPerpMarkets.map((v) => v.baseAssetSymbol).join(", ")}`, + ); } return { marketIndex: token.marketIndex, marketType: MarketType.PERP }; } const token = MainnetSpotMarkets.find((v) => v.symbol === symbol); if (!token) { - throw new Error("Drift doesn't have that market"); + throw new Error( + `Drift doesn't have that market. Here's a list of available spot markets: ${MainnetSpotMarkets.map((v) => v.symbol).join(", ")}`, + ); } return { marketIndex: token.marketIndex, marketType: MarketType.SPOT }; } @@ -134,22 +138,22 @@ export async function createVault( const { vaultClient, driftClient, cleanUp } = await initClients(agent); const marketIndexAndType = getMarketIndexAndType(params.marketName); - if (!marketIndexAndType) { - throw new Error("Invalid market name"); - } - const spotMarket = driftClient.getSpotMarketAccount( marketIndexAndType.marketIndex, ); if (!spotMarket) { - throw new Error("Market not found"); + throw new Error( + `Market not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map((v) => `${v.symbol}-SPOT`).join(", ")}`, + ); } const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); if (marketIndexAndType.marketType === MarketType.PERP) { - throw new Error("Only SPOT market names are supported"); + throw new Error( + `Only SPOT market names are supported. Such as ${MainnetSpotMarkets.map((v) => `${v.symbol}-SPOT`).join(", ")}`, + ); } const tx = await vaultClient.initializeVault({ @@ -239,7 +243,9 @@ export async function updateVault( ); if (!spotMarket) { - throw new Error("Market not found"); + throw new Error( + "Market not found. This vault's market is no longer supported", + ); } const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); @@ -370,7 +376,9 @@ export async function depositIntoVault( ); if (!spotMarket) { - throw new Error("Market not found"); + throw new Error( + "Market not found. This vaults market is no longer supported", + ); } const spotPrecision = TEN.pow(new BN(spotMarket.decimals)); @@ -544,7 +552,7 @@ export async function tradeDriftVault( if (!isOwned) { throw new Error( - "This vault is owned by someone else, so you can't trade with it", + "This vault is owned/delegated to someone else, you can't trade with it", ); } From 79fe5b0cb4eff7ae7039662164c8eccceae13b41 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Thu, 16 Jan 2025 21:33:07 +0100 Subject: [PATCH 28/32] fix: bugs noticed during testing --- .../requestUnstakeFromDriftInsuranceFund.ts | 3 +- src/actions/drift/swapSpotToken.ts | 10 +++-- .../drift/unstakeFromDriftInsuranceFund.ts | 2 +- src/tools/drift/drift.ts | 42 ++++++++++++++++++- src/vercel-ai/index.ts | 10 ++++- 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts b/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts index fc1b645..ca3ef0d 100644 --- a/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts +++ b/src/actions/drift/requestUnstakeFromDriftInsuranceFund.ts @@ -8,8 +8,7 @@ const requestUnstakeFromDriftInsuranceFundAction: Action = { "Request to unstake a certain amount of a token from the Drift Insurance Fund", similes: [ "request an unstake from the drift insurance fund", - "unstake an amount from the drift insurance fund", - "ask to unstake a certain amount from the drift insurance fund", + "request to unstake an amount from the drift insurance fund", ], examples: [ [ diff --git a/src/actions/drift/swapSpotToken.ts b/src/actions/drift/swapSpotToken.ts index a076cb8..1ca07e2 100644 --- a/src/actions/drift/swapSpotToken.ts +++ b/src/actions/drift/swapSpotToken.ts @@ -4,11 +4,13 @@ import { swapSpotToken } from "../../tools"; const driftSpotTokenSwapAction: Action = { name: "DRIFT_SPOT_TOKEN_SWAP_ACTION", - description: "Swap a spot token for another spot token on Drift", + description: "Swap a token for another token on Drift", similes: [ "swap a token for another token on drift", "exchange a token for another token on drift", "trade a token for another token on drift", + "swap usdc to 5 sol on drift (in this case 5 sol is the toAmount)", + "swap 5 usdt to DRIFT on drift (in this case 5 usdt is the fromAmount)", ], examples: [ [ @@ -33,18 +35,18 @@ const driftSpotTokenSwapAction: Action = { fromAmount: z .number() .positive() - .describe("Amount to swap from in normal units e.g 50 === 50 SOL") + .describe("Amount to swap from e.g 50 === 50 SOL") .optional(), toAmount: z .number() .positive() - .describe("Amount to swap to in normal units e.g 5000 === 5000 USDC") + .describe("Amount to swap to e.g 5000 === 5000 USDC") .optional(), slippage: z .number() .positive() .describe("Slippage tolerance in percentage e.g 0.5 === 0.5%") - .optional(), + .default(0.5), }), handler: async (agent, input) => { try { diff --git a/src/actions/drift/unstakeFromDriftInsuranceFund.ts b/src/actions/drift/unstakeFromDriftInsuranceFund.ts index 4d9516e..2b11056 100644 --- a/src/actions/drift/unstakeFromDriftInsuranceFund.ts +++ b/src/actions/drift/unstakeFromDriftInsuranceFund.ts @@ -5,7 +5,7 @@ import { unstakeFromDriftInsuranceFund } from "../../tools"; const unstakeFromDriftInsuranceFundAction: Action = { name: "UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ACTION", description: - "Unstake requested unstake amount from the Drift Insurance fund once the cool period has elapsed", + "Unstake requested unstake token from the Drift Insurance fund once the cool period has elapsed", similes: [ "unstake from the drift insurance fund", "withdraw from the drift insurance fund", diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 57999f5..eb3f27c 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -4,6 +4,7 @@ import { DRIFT_PROGRAM_ID, DriftClient, FastSingleTxSender, + getInsuranceFundStakeAccountPublicKey, getLimitOrderParams, getMarketOrderParams, getUserAccountPublicKeySync, @@ -514,6 +515,25 @@ export async function stakeToDriftInsuranceFund( ); } + const deriveInsuranceFundStakeAccount = + getInsuranceFundStakeAccountPublicKey( + driftClient.program.programId, + agent.wallet.publicKey, + token.marketIndex, + ); + let shouldCreateAccount = false; + + try { + await driftClient.connection.getAccountInfo( + deriveInsuranceFundStakeAccount, + ); + } catch (e) { + // @ts-expect-error - error message is a string + if (e.message.includes("Account not found")) { + shouldCreateAccount = true; + } + } + const signature = await driftClient.addInsuranceFundStake({ amount: numberToSafeBN(amount, token.precision), marketIndex: token.marketIndex, @@ -521,6 +541,7 @@ export async function stakeToDriftInsuranceFund( token.mint, agent.wallet.publicKey, ), + initializeStakeAccount: shouldCreateAccount, txParams: { computeUnitsPrice: 0.000002 * 1000000 * 1000000, }, @@ -620,6 +641,7 @@ export async function unstakeFromDriftInsuranceFund( * @param params.toSymbol symbol of the token to receive * @param params.fromAmount amount of the token to deposit * @param params.toAmount amount of the token to receive + * @param params.slippage slippage tolerance in percentage */ export async function swapSpotToken( agent: SolanaAgentKit, @@ -668,12 +690,20 @@ export async function swapSpotToken( const jupiterClient = new JupiterClient({ connection: agent.connection }); // @ts-expect-error - false undefined type conflict const fromAmount = numberToSafeBN(params.fromAmount, fromToken.precision); + const res = await ( + await fetch( + `https://quote-api.jup.ag/v6/quote?inputMint=${fromToken.mint}&outputMint=${toToken.mint}&amount=${fromAmount.toNumber()}&slippageBps=${(params.slippage ?? 0.5) * 100}&swapMode=ExactIn`, + ) + ).json(); const signature = await driftClient.swap({ amount: fromAmount, inMarketIndex: fromToken.marketIndex, outMarketIndex: toToken.marketIndex, jupiterClient: jupiterClient, - slippageBps: params.slippage ?? 100, + v6: { + quote: res, + }, + slippageBps: (params.slippage ?? 0.5) * 100, swapMode: "ExactIn", }); @@ -685,12 +715,20 @@ export async function swapSpotToken( const jupiterClient = new JupiterClient({ connection: agent.connection }); // @ts-expect-error - false undefined type conflict const toAmount = numberToSafeBN(params.toAmount, toToken.precision); + const res = await ( + await fetch( + `https://quote-api.jup.ag/v6/quote?inputMint=${fromToken.mint}&outputMint=${toToken.mint}&amount=${toAmount.toNumber()}&slippageBps=${(params.slippage ?? 0.5) * 100}&swapMode=ExactOut`, + ) + ).json(); const signature = await driftClient.swap({ amount: toAmount, inMarketIndex: toToken.marketIndex, outMarketIndex: fromToken.marketIndex, jupiterClient: jupiterClient, - slippageBps: params.slippage ?? 100, + v6: { + quote: res, + }, + slippageBps: (params.slippage ?? 0.5) * 100, swapMode: "ExactOut", }); diff --git a/src/vercel-ai/index.ts b/src/vercel-ai/index.ts index ba35643..8d1219a 100644 --- a/src/vercel-ai/index.ts +++ b/src/vercel-ai/index.ts @@ -14,7 +14,15 @@ export function createSolanaTools( tools[key] = tool({ // @ts-expect-error Value matches type however TS still shows error id: action.name, - description: action.description, + description: ` + ${action.description} + + Similes: ${action.similes.map( + (simile) => ` + ${simile} + `, + )} + `.slice(0, 1023), parameters: action.schema, execute: async (params) => await executeAction(action, solanaAgentKit, params), From 0c840d9bcbe2f0d26a9beafc6782db636bfc9a66 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 17 Jan 2025 17:12:34 +0100 Subject: [PATCH 29/32] feat: add more drift actions --- src/actions/drift/entryQuoteOfPerpTrade.ts | 65 +++++ src/actions/drift/getLendAndBorrowAPY.ts | 52 ++++ src/actions/drift/perpMarketFundingRate.ts | 61 ++++ src/actions/index.ts | 6 + src/agent/index.ts | 19 ++ .../drift/entry_quote_of_perp_trade.ts | 39 +++ src/langchain/drift/index.ts | 7 + src/langchain/drift/lend_and_borrow_apy.ts | 32 +++ .../drift/perp_market_funding_rate.ts | 36 +++ src/langchain/index.ts | 16 +- src/tools/drift/drift.ts | 260 ++++++++++++++++++ src/tools/drift/types.ts | 33 +++ 12 files changed, 625 insertions(+), 1 deletion(-) create mode 100644 src/actions/drift/entryQuoteOfPerpTrade.ts create mode 100644 src/actions/drift/getLendAndBorrowAPY.ts create mode 100644 src/actions/drift/perpMarketFundingRate.ts create mode 100644 src/langchain/drift/entry_quote_of_perp_trade.ts create mode 100644 src/langchain/drift/lend_and_borrow_apy.ts create mode 100644 src/langchain/drift/perp_market_funding_rate.ts create mode 100644 src/tools/drift/types.ts diff --git a/src/actions/drift/entryQuoteOfPerpTrade.ts b/src/actions/drift/entryQuoteOfPerpTrade.ts new file mode 100644 index 0000000..a524968 --- /dev/null +++ b/src/actions/drift/entryQuoteOfPerpTrade.ts @@ -0,0 +1,65 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { getEntryQuoteOfPerpTrade } from "../../tools"; + +const entryQuoteOfPerpTradeAction: Action = { + name: "DRIFT_GET_ENTRY_QUOTE_OF_PERP_TRADE_ACTION", + description: "Get the entry quote of a perpetual trade on Drift", + similes: [ + "get the entry quote of a perpetual trade on drift", + "get the entry quote of a perp trade on drift", + "get the entry quote of the BTC-PERP trade on drift", + "get the entry quote of the SOL-PERP trade on drift", + "get the entry quote of a 1000 USDC long on the SOL-PERP market", + "get the entry quote of a 1000 USDC short on the SOL-PERP market", + "quote for a $1000 long on the BTC-PERP market", + ], + examples: [ + [ + { + input: { + marketSymbol: "BTC-PERP", + type: "long", + amount: 1000, + }, + output: { + status: "success", + data: { + entryPrice: 100000, + priceImpact: 0.0001, + bestPrice: 100001, + worstPrice: 99999, + baseFilled: 1000, + quoteFilled: 1000, + }, + }, + explanation: + "Get the entry quote of a $1000 long on the BTC-PERP market", + }, + ], + ], + schema: z.object({ + marketSymbol: z.string().describe("Symbol of the perpetual market"), + type: z.enum(["long", "short"]).describe("Type of trade"), + amount: z.number().positive().describe("Amount to trade"), + }), + handler: async (agent, input) => { + try { + const data = await getEntryQuoteOfPerpTrade( + input.marketSymbol, + input.amount, + input.type, + ); + + return data; + } catch (e) { + return { + status: "error", + // @ts-expect-error error is not a string + message: e.message, + }; + } + }, +}; + +export default entryQuoteOfPerpTradeAction; diff --git a/src/actions/drift/getLendAndBorrowAPY.ts b/src/actions/drift/getLendAndBorrowAPY.ts new file mode 100644 index 0000000..239b66b --- /dev/null +++ b/src/actions/drift/getLendAndBorrowAPY.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { getLendingAndBorrowAPY } from "../../tools"; + +const lendAndBorrowAPYAction: Action = { + name: "DRIFT_GET_LEND_AND_BORROW_APY_ACTION", + description: "Get the lending and borrowing APY (in %) of a token on Drift", + similes: [ + "get the lending and borrowing APY of a token on drift", + "get the lending and borrowing APY of a token on drift", + "get the lending and borrowing APY of the USDC token on drift", + "get the lending and borrowing APY of the SOL token on drift", + ], + examples: [ + [ + { + input: { + symbol: "USDC", + }, + output: { + status: "success", + data: { + lendingAPY: 10, + borrowingAPY: 12.1, + }, + }, + explanation: "Get the lending and borrowing APY of the USDC token", + }, + ], + ], + schema: z.object({ + symbol: z.string().describe("Symbol of the token"), + }), + handler: async (agent, input) => { + try { + const data = await getLendingAndBorrowAPY(agent, input.symbol); + + return { + status: "success", + data, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error error is not a string + message: e.message, + }; + } + }, +}; + +export default lendAndBorrowAPYAction; diff --git a/src/actions/drift/perpMarketFundingRate.ts b/src/actions/drift/perpMarketFundingRate.ts new file mode 100644 index 0000000..e15d477 --- /dev/null +++ b/src/actions/drift/perpMarketFundingRate.ts @@ -0,0 +1,61 @@ +import { z } from "zod"; +import type { Action } from "../../types"; +import { calculatePerpMarketFundingRate } from "../../tools"; + +const perpMarktetFundingRateAction: Action = { + name: "DRIFT_PERP_MARKET_FUNDING_RATE_ACTION", + description: "Get the funding rate of a perpetual market on Drift", + similes: [ + "get the yearly funding rate of a perpetual market on drift", + "get the funding rate of a perp market on drift", + "get the hourly funding rate of a perpetual market on drift", + "get the funding rate of the BTC-PERP market on drift", + "get the funding rate of the SOL-PERP market on drift", + ], + examples: [ + [ + { + input: { + marketSymbol: "BTC-PERP", + }, + output: { + status: "success", + data: { + longRate: 0.0001, + shortRate: 0.0002, + }, + }, + explanation: "Get the funding rate of the BTC-PERP market", + }, + ], + ], + schema: z.object({ + marketSymbol: z + .string() + .toUpperCase() + .describe("Symbol of the perpetual market"), + period: z.enum(["year", "hour"]).default("hour").optional(), + }), + handler: async (agent, input) => { + try { + const data = await calculatePerpMarketFundingRate( + agent, + input.marketSymbol, + input.period, + ); + + return { + status: "success", + data, + }; + } catch (e) { + return { + status: "error", + // @ts-expect-error error is not a string + message: e.message, + }; + } + }, +}; + +export default perpMarktetFundingRateAction; diff --git a/src/actions/index.ts b/src/actions/index.ts index 5b4324e..03a5b83 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -64,6 +64,9 @@ import stakeToDriftInsuranceFundAction from "./drift/stakeToDriftInsuranceFund"; import requestUnstakeFromDriftInsuranceFundAction from "./drift/requestUnstakeFromDriftInsuranceFund"; import unstakeFromDriftInsuranceFundAction from "./drift/unstakeFromDriftInsuranceFund"; import driftSpotTokenSwapAction from "./drift/swapSpotToken"; +import perpMarktetFundingRateAction from "./drift/perpMarketFundingRate"; +import entryQuoteOfPerpTradeAction from "./drift/entryQuoteOfPerpTrade"; +import lendAndBorrowAPYAction from "./drift/getLendAndBorrowAPY"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -134,6 +137,9 @@ export const ACTIONS = { requestUnstakeFromDriftInsuranceFundAction, UNSTAKE_FROM_DRIFT_INSURANCE_FUND_ACTION: unstakeFromDriftInsuranceFundAction, DRIFT_SPOT_TOKEN_SWAP_ACTION: driftSpotTokenSwapAction, + DRIFT_PERP_MARKET_FUNDING_RATE_ACTION: perpMarktetFundingRateAction, + DRIFT_GET_ENTRY_QUOTE_OF_PERP_TRADE_ACTION: entryQuoteOfPerpTradeAction, + DRIFT_GET_LEND_AND_BORROW_APY_ACTION: lendAndBorrowAPYAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/agent/index.ts b/src/agent/index.ts index 0f6c834..52add58 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -104,6 +104,9 @@ import { requestUnstakeFromDriftInsuranceFund, unstakeFromDriftInsuranceFund, swapSpotToken, + calculatePerpMarketFundingRate, + getEntryQuoteOfPerpTrade, + getLendingAndBorrowAPY, } from "../tools"; import { Config, @@ -871,4 +874,20 @@ export class SolanaAgentKit { slippage: params.slippage, }); } + async getPerpMarketFundingRate( + symbol: `${string}-PERP`, + period: "year" | "hour" = "year", + ) { + return calculatePerpMarketFundingRate(this, symbol, period); + } + async getEntryQuoteOfPerpTrade( + amount: number, + symbol: `${string}-PERP`, + action: "short" | "long", + ) { + return getEntryQuoteOfPerpTrade(symbol, amount, action); + } + async getLendAndBorrowAPY(symbol: string) { + return getLendingAndBorrowAPY(this, symbol); + } } diff --git a/src/langchain/drift/entry_quote_of_perp_trade.ts b/src/langchain/drift/entry_quote_of_perp_trade.ts new file mode 100644 index 0000000..30e04fe --- /dev/null +++ b/src/langchain/drift/entry_quote_of_perp_trade.ts @@ -0,0 +1,39 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaDriftEntryQuoteOfPerpTradeTool extends Tool { + name = "drift_entry_quote_of_perp_trade"; + description = `Get an entry quote for a perpetual trade on Drift protocol. + + Inputs (JSON string): + - amount: number, amount to trade (required) + - symbol: string, market symbol (required) + - action: "long" | "short", trade direction (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const quote = await this.solanaKit.getEntryQuoteOfPerpTrade( + parsedInput.amount, + parsedInput.symbol, + parsedInput.action, + ); + + return JSON.stringify({ + status: "success", + message: `Entry quote retrieved for ${parsedInput.action} ${parsedInput.amount} ${parsedInput.symbol}`, + data: quote, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "ENTRY_QUOTE_OF_PERP_TRADE_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/index.ts b/src/langchain/drift/index.ts index 3c9a4c8..34627d7 100644 --- a/src/langchain/drift/index.ts +++ b/src/langchain/drift/index.ts @@ -13,3 +13,10 @@ export * from "./update_vault"; export * from "./vault_info"; export * from "./withdraw_from_account"; export * from "./withdraw_from_vault"; +export * from "./perp_market_funding_rate"; +export * from "./entry_quote_of_perp_trade"; +export * from "./lend_and_borrow_apy"; +export * from "./stake_to_insurance_fund"; +export * from "./swap_spot_token"; +export * from "./unstake_from_insurance_fund"; +export * from "./request_unstake_from_insurance_fund"; diff --git a/src/langchain/drift/lend_and_borrow_apy.ts b/src/langchain/drift/lend_and_borrow_apy.ts new file mode 100644 index 0000000..25eacad --- /dev/null +++ b/src/langchain/drift/lend_and_borrow_apy.ts @@ -0,0 +1,32 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaDriftLendAndBorrowAPYTool extends Tool { + name = "drift_lend_and_borrow_apy"; + description = `Get lending and borrowing APY for a token on Drift protocol. + + Inputs (JSON string): + - symbol: string, token symbol (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const apyInfo = await this.solanaKit.getLendAndBorrowAPY(input); + + return JSON.stringify({ + status: "success", + message: `APY information retrieved for ${input}`, + data: apyInfo, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "LEND_AND_BORROW_APY_ERROR", + }); + } + } +} diff --git a/src/langchain/drift/perp_market_funding_rate.ts b/src/langchain/drift/perp_market_funding_rate.ts new file mode 100644 index 0000000..6e17810 --- /dev/null +++ b/src/langchain/drift/perp_market_funding_rate.ts @@ -0,0 +1,36 @@ +import { Tool } from "langchain/tools"; +import type { SolanaAgentKit } from "../../agent"; + +export class SolanaDriftPerpMarketFundingRateTool extends Tool { + name = "drift_perp_market_funding_rate"; + description = `Get the funding rate for a perpetual market on Drift protocol. + + Inputs (JSON string): + - symbol: string, market symbol (required) + - period: year or hour (default: hour)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + const fundingRate = await this.solanaKit.getPerpMarketFundingRate( + parsedInput.symbol, + parsedInput.period, + ); + + return JSON.stringify({ + status: "success", + message: `Funding rate retrieved for ${parsedInput.symbol}`, + data: fundingRate, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + }); + } + } +} diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 809c340..7fe40e3 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -27,7 +27,7 @@ export * from "./squads"; export * from "./helius"; export * from "./drift"; -import { SolanaAgentKit } from "../agent"; +import type { SolanaAgentKit } from "../agent"; import { SolanaBalanceTool, SolanaBalanceOtherTool, @@ -114,6 +114,13 @@ import { SolanaUpdateDriftVaultTool, SolanaWithdrawFromDriftAccountTool, SolanaWithdrawFromDriftVaultTool, + SolanaDriftLendAndBorrowAPYTool, + SolanaDriftEntryQuoteOfPerpTradeTool, + SolanaDriftPerpMarketFundingRateTool, + SolanaDriftSpotTokenSwapTool, + SolanaRequestUnstakeFromDriftInsuranceFundTool, + SolanaStakeToDriftInsuranceFundTool, + SolanaUnstakeFromDriftInsuranceFundTool, } from "./index"; export function createSolanaTools(solanaKit: SolanaAgentKit) { @@ -208,5 +215,12 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaDriftVaultInfoTool(solanaKit), new SolanaWithdrawFromDriftAccountTool(solanaKit), new SolanaWithdrawFromDriftVaultTool(solanaKit), + new SolanaDriftSpotTokenSwapTool(solanaKit), + new SolanaStakeToDriftInsuranceFundTool(solanaKit), + new SolanaRequestUnstakeFromDriftInsuranceFundTool(solanaKit), + new SolanaUnstakeFromDriftInsuranceFundTool(solanaKit), + new SolanaDriftLendAndBorrowAPYTool(solanaKit), + new SolanaDriftEntryQuoteOfPerpTradeTool(solanaKit), + new SolanaDriftPerpMarketFundingRateTool(solanaKit), ]; } diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index eb3f27c..9f8f88d 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -1,9 +1,16 @@ import { BASE_PRECISION, + BigNum, + calculateDepositRate, + calculateEstimatedEntryPriceWithL2, + calculateInterestRate, + calculateLongShortFundingRateAndLiveTwaps, convertToNumber, DRIFT_PROGRAM_ID, DriftClient, FastSingleTxSender, + FUNDING_RATE_BUFFER_PRECISION, + FUNDING_RATE_PRECISION_EXP, getInsuranceFundStakeAccountPublicKey, getLimitOrderParams, getMarketOrderParams, @@ -12,6 +19,7 @@ import { MainnetPerpMarkets, MainnetSpotMarkets, numberToSafeBN, + PERCENTAGE_PRECISION, PositionDirection, PostOnlyParams, PRICE_PRECISION, @@ -26,6 +34,7 @@ import { getAssociatedTokenAddressSync } from "@solana/spl-token"; import { PublicKey } from "@solana/web3.js"; import { Transaction } from "@solana/web3.js"; import { ComputeBudgetProgram } from "@solana/web3.js"; +import type { RawL2Output } from "./types"; export async function initClients( agent: SolanaAgentKit, @@ -748,3 +757,254 @@ export async function swapSpotToken( throw new Error(`Failed to swap token: ${e.message}`); } } + +/** + * To get funding rate as a percentage, you need to multiply by the funding rate buffer precision + * @param rawFundingRate + */ +export function getFundingRateAsPercentage(rawFundingRate: anchor.BN) { + return BigNum.from( + rawFundingRate.mul(FUNDING_RATE_BUFFER_PRECISION), + FUNDING_RATE_PRECISION_EXP, + ).toNum(); +} + +/** + * Calculate the funding rate for a perpetual market + * @param agent + * @param marketSymbol + */ +export async function calculatePerpMarketFundingRate( + agent: SolanaAgentKit, + marketSymbol: `${string}-PERP`, + period: "year" | "hour", +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const market = driftClient.getMarketIndexAndType( + `${marketSymbol.toUpperCase()}`, + ); + + if (!market) { + throw new Error( + `This market isn't available on the Drift Protocol. Here's a list of markets that are: ${MainnetPerpMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + const marketAccount = driftClient.getPerpMarketAccount(market.marketIndex); + + if (!marketAccount) { + throw new Error("Market account not found"); + } + + const [ + _marketTwapLive, + _oracleTwapLive, + longFundingRate, + shortFundingRate, + ] = await calculateLongShortFundingRateAndLiveTwaps( + marketAccount, + driftClient.getOracleDataForPerpMarket(market.marketIndex), + undefined, + new anchor.BN(Date.now()), + ); + + await cleanUp(); + + let longFundingRateNum = getFundingRateAsPercentage(longFundingRate); + let shortFundingRateNum = getFundingRateAsPercentage(shortFundingRate); + + if (period === "year") { + const paymentsPerYear = 24 * 365.25; + + longFundingRateNum *= paymentsPerYear; + shortFundingRateNum *= paymentsPerYear; + } + + const longsArePaying = longFundingRateNum > 0; + const shortsArePaying = !(shortFundingRateNum > 0); + + const longsAreString = longsArePaying ? "pay" : "receive"; + const shortsAreString = !shortsArePaying ? "receive" : "pay"; + + const absoluteLongFundingRateNum = Math.abs(longFundingRateNum); + const absoluteShortFundingRateNum = Math.abs(shortFundingRateNum); + + const formattedLongRatePct = absoluteLongFundingRateNum.toFixed( + period === "hour" ? 5 : 2, + ); + const formattedShortRatePct = absoluteShortFundingRateNum.toFixed( + period === "hour" ? 5 : 2, + ); + + const paymentUnit = period === "year" ? "% APR" : "%"; + + const friendlyString = `At this rate, longs would ${longsAreString} ${formattedLongRatePct} ${paymentUnit} and shorts would ${shortsAreString} ${formattedShortRatePct} ${paymentUnit} at the end of the hour.`; + + return { + longRate: longsArePaying + ? -absoluteLongFundingRateNum + : absoluteLongFundingRateNum, + shortRate: shortsArePaying + ? -absoluteShortFundingRateNum + : absoluteShortFundingRateNum, + friendlyString, + }; + } catch (e) { + throw new Error( + // @ts-expect-error e.message is a string + `Something went wrong while trying to get the market's funding rate. Here's some more context: ${e.message}`, + ); + } +} + +export async function getL2OrderBook(marketSymbol: `${string}-PERP`) { + try { + const serializedOrderbook: RawL2Output = await ( + await fetch( + `https://dlob.drift.trade/l2?marketName=${marketSymbol.toUpperCase()}&includeOracle=true`, + ) + ).json(); + + return { + asks: serializedOrderbook.asks.map((ask) => ({ + price: new anchor.BN(ask.price), + size: new anchor.BN(ask.size), + sources: Object.entries(ask.sources).reduce((previous, [key, val]) => { + return { + ...(previous ?? {}), + [key]: new anchor.BN(val), + }; + }, {}), + })), + bids: serializedOrderbook.bids.map((bid) => ({ + price: new anchor.BN(bid.price), + size: new anchor.BN(bid.size), + sources: Object.entries(bid.sources).reduce((previous, [key, val]) => { + return { + ...(previous ?? {}), + [key]: new anchor.BN(val), + }; + }, {}), + })), + oracleData: { + price: serializedOrderbook.oracleData.price + ? new anchor.BN(serializedOrderbook.oracleData.price) + : undefined, + slot: serializedOrderbook.oracleData.slot + ? new anchor.BN(serializedOrderbook.oracleData.slot) + : undefined, + confidence: serializedOrderbook.oracleData.confidence + ? new anchor.BN(serializedOrderbook.oracleData.confidence) + : undefined, + hasSufficientNumberOfDataPoints: + serializedOrderbook.oracleData.hasSufficientNumberOfDataPoints, + twap: serializedOrderbook.oracleData.twap + ? new anchor.BN(serializedOrderbook.oracleData.twap) + : undefined, + twapConfidence: serializedOrderbook.oracleData.twapConfidence + ? new anchor.BN(serializedOrderbook.oracleData.twapConfidence) + : undefined, + maxPrice: serializedOrderbook.oracleData.maxPrice + ? new anchor.BN(serializedOrderbook.oracleData.maxPrice) + : undefined, + }, + slot: serializedOrderbook.slot, + }; + } catch (e) { + throw new Error(); + } +} + +/** + * Get the estimated entry quote of a perp trade + * @param agent + * @param marketSymbol + * @param amount + * @param type + */ +export async function getEntryQuoteOfPerpTrade( + marketSymbol: `${string}-PERP`, + amount: number, + type: "long" | "short", +) { + try { + const l2OrderBookData = await getL2OrderBook(marketSymbol); + const estimatedEntryPriceData = calculateEstimatedEntryPriceWithL2( + "quote", + numberToSafeBN(amount, BASE_PRECISION), + type === "long" ? PositionDirection.LONG : PositionDirection.SHORT, + BASE_PRECISION, + // @ts-expect-error - false type conflict + l2OrderBookData, + ); + + return { + entryPrice: convertToNumber( + estimatedEntryPriceData.entryPrice, + QUOTE_PRECISION, + ), + priceImpact: convertToNumber( + estimatedEntryPriceData.priceImpact, + QUOTE_PRECISION, + ), + bestPrice: convertToNumber( + estimatedEntryPriceData.bestPrice, + QUOTE_PRECISION, + ), + worstPrice: convertToNumber( + estimatedEntryPriceData.worstPrice, + QUOTE_PRECISION, + ), + }; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to get entry quote: ${e.message}`); + } +} + +/** + * Get the APY for lending and borrowing a specific token on drift protocol + * @param agent + * @param symbol + */ +export async function getLendingAndBorrowAPY( + agent: SolanaAgentKit, + symbol: string, +) { + try { + const { driftClient, cleanUp } = await initClients(agent); + const token = MainnetSpotMarkets.find( + (v) => v.symbol === symbol.toUpperCase(), + ); + + if (!token) { + throw new Error( + `Token with symbol ${symbol} not found. Here's a list of available spot markets: ${MainnetSpotMarkets.map( + (v) => v.symbol, + ).join(", ")}`, + ); + } + + const marketAccount = driftClient.getSpotMarketAccount(token.marketIndex); + + if (!marketAccount) { + throw new Error("Market account not found"); + } + + const lendAPY = calculateDepositRate(marketAccount); + const borrowAPY = calculateInterestRate(marketAccount); + + await cleanUp(); + + return { + lendingAPY: convertToNumber(lendAPY, PERCENTAGE_PRECISION) * 100, // convert to percentage + borrowAPY: convertToNumber(borrowAPY, PERCENTAGE_PRECISION) * 100, // convert to percentage + }; + } catch (e) { + // @ts-expect-error - error message is a string + throw new Error(`Failed to get APYs: ${e.message}`); + } +} diff --git a/src/tools/drift/types.ts b/src/tools/drift/types.ts new file mode 100644 index 0000000..4784109 --- /dev/null +++ b/src/tools/drift/types.ts @@ -0,0 +1,33 @@ +import type { L2OrderBook, MarketType, OraclePriceData } from "@drift-labs/sdk"; + +export type L2WithOracle = L2OrderBook & { oracleData: OraclePriceData }; + +export type RawL2Output = { + marketIndex: number; + marketType: MarketType; + marketName: string; + asks: { + price: string; + size: string; + sources: { + [key: string]: string; + }; + }[]; + bids: { + price: string; + size: string; + sources: { + [key: string]: string; + }; + }[]; + oracleData: { + price: string; + slot: string; + confidence: string; + hasSufficientNumberOfDataPoints: boolean; + twap?: string; + twapConfidence?: string; + maxPrice?: string; + }; + slot?: number; +}; From 67fa8217a7ab5cd780f67d1d7692157c40440d75 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 17 Jan 2025 17:15:05 +0100 Subject: [PATCH 30/32] fix: revert all changes in vercel ai test file --- test/agent_sdks/vercel_ai.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/agent_sdks/vercel_ai.ts b/test/agent_sdks/vercel_ai.ts index bf1585e..130528b 100644 --- a/test/agent_sdks/vercel_ai.ts +++ b/test/agent_sdks/vercel_ai.ts @@ -194,4 +194,4 @@ if (require.main === module) { console.error("Fatal error:", error); process.exit(1); }); -} +} \ No newline at end of file From e4fa501c52456885087d448e530c31f3d6131ecf Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 17 Jan 2025 17:23:15 +0100 Subject: [PATCH 31/32] chore: add minimum compute price to constants --- src/constants/index.ts | 6 ++++++ src/tools/drift/drift.ts | 15 ++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/constants/index.ts b/src/constants/index.ts index 69965bf..5e261b4 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -33,3 +33,9 @@ export const DEFAULT_OPTIONS = { export const JUP_API = "https://quote-api.jup.ag/v6"; export const JUP_REFERRAL_ADDRESS = "REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3"; + +/** + * Minimum compute price required to carry out complex transactions on the Drift protocol + */ +export const MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS = + 0.000003 * 1000000 * 1000000; diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 9f8f88d..6c6ec1b 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -35,6 +35,7 @@ import { PublicKey } from "@solana/web3.js"; import { Transaction } from "@solana/web3.js"; import { ComputeBudgetProgram } from "@solana/web3.js"; import type { RawL2Output } from "./types"; +import { MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS } from "../../constants"; export async function initClients( agent: SolanaAgentKit, @@ -68,7 +69,7 @@ export async function initClients( activeSubAccountId: params?.activeSubAccountId, subAccountIds: params?.subAccountIds, txParams: { - computeUnitsPrice: 0.000001 * 1000000 * 1000000, + computeUnitsPrice: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }, txSender: new FastSingleTxSender({ connection: agent.connection, @@ -212,7 +213,7 @@ export async function depositToDriftUserAccount( const tx = new Transaction().add(...depInstruction).add( ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 0.000001 * 1000000 * 1000000, + microLamports: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }), ); tx.recentBlockhash = latestBlockhash.blockhash; @@ -277,7 +278,7 @@ export async function withdrawFromDriftUserAccount( const tx = new Transaction().add(...withdrawInstruction).add( ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: 0.000003 * 1000000 * 1000000, + microLamports: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }), ); tx.recentBlockhash = latestBlockhash.blockhash; @@ -384,7 +385,7 @@ export async function driftPerpTrade( marketIndex: market.marketIndex, }), { - computeUnitsPrice: 0.000001 * 1000000 * 1000000, + computeUnitsPrice: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }, ); } @@ -552,7 +553,7 @@ export async function stakeToDriftInsuranceFund( ), initializeStakeAccount: shouldCreateAccount, txParams: { - computeUnitsPrice: 0.000002 * 1000000 * 1000000, + computeUnitsPrice: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }, }); @@ -592,7 +593,7 @@ export async function requestUnstakeFromDriftInsuranceFund( const signature = await driftClient.requestRemoveInsuranceFundStake( token.marketIndex, numberToSafeBN(amount, token.precision), - { computeUnitsPrice: 0.000002 * 1000000 * 1000000 }, + { computeUnitsPrice: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS }, ); await cleanUp(); @@ -630,7 +631,7 @@ export async function unstakeFromDriftInsuranceFund( token.marketIndex, getAssociatedTokenAddressSync(token.mint, agent.wallet.publicKey), { - computeUnitsPrice: 0.000002 * 1000000 * 1000000, + computeUnitsPrice: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }, ); From 6bbb6d489c5b83229e6a78b3d1041ea1d780e732 Mon Sep 17 00:00:00 2001 From: biccsdev Date: Fri, 17 Jan 2025 12:14:47 -0600 Subject: [PATCH 32/32] implemented nft creation with LP --- README.md | 6 +- package.json | 2 +- pnpm-lock.yaml | 371 +++++++++++++++++++- src/agent/index.ts | 2 + src/langchain/3land/create_collection.ts | 9 +- src/langchain/3land/create_single.ts | 27 +- src/tools/3land/create_3land_collectible.ts | 5 +- test/tools/3land.ts | 9 +- 8 files changed, 391 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index f796ed3..4d36f4a 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ const result = await agent.create3LandCollection( When creating an NFT using 3Land's tool, it automatically goes for sale on 3.land website ```typescript const isDevnet = true; // (Optional) if not present TX takes place in Mainnet - +const withPool = true; // (Optional) only present if NFT will be created with a Liquidity Pool for a specific SPL token const collectionAccount = ""; //hash for the collection const createItemOptions: CreateSingleOptions = { itemName: "", @@ -165,13 +165,15 @@ const createItemOptions: CreateSingleOptions = { { trait_type: "", value: "" }, ], price: 0, //100000000 == 0.1 sol, can be set to 0 for a free mint + splHash: "", //present if listing is on a specific SPL token, if not present sale will be on $SOL, must be present if "withPool" is true + poolName: "", // Only present if "withPool" is true mainImageUrl: "", - splHash: "", //present if listing is on a specific SPL token, if not present sale will be on $SOL }; const result = await agent.create3LandNft( collectionAccount, createItemOptions, isDevnet, // (Optional) if not present TX takes place in Mainnet + withPool ); ``` diff --git a/package.json b/package.json index d62664b..d6966fd 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "author": "sendaifun", "license": "Apache-2.0", "dependencies": { - "@3land/listings-sdk": "^0.0.4", + "@3land/listings-sdk": "^0.0.6", "@ai-sdk/openai": "^1.0.11", "@bonfida/spl-name-service": "^3.0.7", "@cks-systems/manifest-sdk": "0.1.59", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31aed29..ea5bf1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@3land/listings-sdk': - specifier: ^0.0.4 - version: 0.0.4(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + specifier: ^0.0.6 + version: 0.0.6(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@ai-sdk/openai': specifier: ^1.0.11 version: 1.0.11(zod@3.24.1) @@ -174,8 +174,8 @@ importers: packages: - '@3land/listings-sdk@0.0.4': - resolution: {integrity: sha512-Ljq8R4e7y+wl4m8BGhiInFPCHEzHZZFz1qghnbc8B3bLEKXWM9+2gZOCAa84rdUKuLfzenEdeS2LclTKhdKTFQ==} + '@3land/listings-sdk@0.0.6': + resolution: {integrity: sha512-1OG4qddbij7kLGcyRvwA9WUiif7DJi2gEWODHF4NnfgQHRl22yLSFHZeHPLlo9mE1T2LZnn0I6HtUxvUtCHCAQ==} '@ai-sdk/openai@1.0.11': resolution: {integrity: sha512-qI9s7Slma5i5bB4yYVlFdcG3PNDwdqivPT1Dr8adDX92nSSpILjgFIooS5yys9sXjvvcfOi/WXbDvVhLSRRlvg==} @@ -612,6 +612,12 @@ packages: engines: {node: '>=6'} hasBin: true + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1160,6 +1166,15 @@ packages: '@shikijs/vscode-textmate@10.0.1': resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1304,6 +1319,10 @@ packages: resolution: {integrity: sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==} engines: {node: '>= 10'} + '@solana/spl-token@0.2.0': + resolution: {integrity: sha512-RWcn31OXtdqIxmkzQfB2R+WpsJOVS6rKuvpxJFjvik2LyODd+WN58ZP3Rpjpro03fscGAkzlFuP3r42doRJgyQ==} + engines: {node: '>= 14'} + '@solana/spl-token@0.3.11': resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} engines: {node: '>=16'} @@ -1411,6 +1430,9 @@ packages: resolution: {integrity: sha512-tuwHtoYzvqnahsMrecfNNkQceCYwgiY0qKS8RwqtaxvDEgjm0E+0bXwKz2eUD3ZFYifomJmRKDmSBx9yQzAeMQ==} engines: {node: '>=20.18.0'} + '@ts-morph/common@0.19.0': + resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -1662,6 +1684,10 @@ packages: '@solana/web3.js': ^1.78.4 solana-bankrun: ^0.2.0 + anchor-client-gen@0.28.1: + resolution: {integrity: sha512-Gi205FuTSk1+haoYAGBDAA4h0X1xfmY0C++CQIWwtXIMCSy5+71XEaFMPgmjtYdvVJoAL021NqVrDiBHhNJ+fQ==} + hasBin: true + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1710,6 +1736,9 @@ packages: arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1814,6 +1843,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} @@ -1914,6 +1946,10 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1942,6 +1978,10 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + check-more-types@2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -1984,6 +2024,9 @@ packages: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2095,6 +2138,15 @@ packages: supports-color: optional: true + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -2205,6 +2257,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2379,6 +2434,9 @@ packages: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -2401,6 +2459,10 @@ packages: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -2550,6 +2612,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -2587,6 +2652,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -2702,6 +2771,10 @@ packages: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -2821,6 +2894,10 @@ packages: resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} engines: {node: '>=10'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2859,6 +2936,9 @@ packages: jito-ts@3.0.1: resolution: {integrity: sha512-TSofF7KqcwyaWGjPaSYC8RDoNBY1TPRNBHdrw24bdIi7mQ5bFEDdYK3D//llw/ml8YDvcZlgd644WxhjLTS9yg==} + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -2997,6 +3077,10 @@ packages: openai: optional: true + lazy-ass@1.6.0: + resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} + engines: {node: '> 0.8'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3090,6 +3174,9 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -3205,6 +3292,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3223,9 +3314,17 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3318,6 +3417,10 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3433,6 +3536,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3464,6 +3570,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -3535,6 +3644,11 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -3815,9 +3929,17 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + spok@1.5.5: resolution: {integrity: sha512-IrJIXY54sCNFASyHPOY+jEirkiJ26JDqsGiI0Dvhwcnkl0PEWi1PSsrkYql0rzDw8LFVTcA7rdUCAJdE2HE+2Q==} + start-server-and-test@1.15.4: + resolution: {integrity: sha512-ucQtp5+UCr0m4aHlY+aEV2JSYNTiMZKdSKK/bsIr6AlmwAWDYDnV7uGlWWEtWa7T4XvRI5cPYcPcQgeLqpz+Tg==} + engines: {node: '>=6'} + hasBin: true + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -3826,6 +3948,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} @@ -3866,6 +3991,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -3985,6 +4114,9 @@ packages: ts-log@2.2.7: resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} + ts-morph@18.0.0: + resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -4173,6 +4305,11 @@ packages: vlq@2.0.4: resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} + wait-on@7.0.1: + resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==} + engines: {node: '>=12.0.0'} + hasBin: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -4314,17 +4451,20 @@ packages: snapshots: - '@3land/listings-sdk@0.0.4(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + '@3land/listings-sdk@0.0.6(@types/node@22.10.5)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@irys/sdk': 0.2.11(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@project-serum/anchor': 0.26.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + anchor-client-gen: 0.28.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) bn: 1.0.5 bn.js: 5.2.1 bs58: 6.0.0 + buffer-layout: 1.2.2 cyrb53: 1.0.0 fs: 0.0.1-security irys: 0.0.1 @@ -5165,6 +5305,12 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -5188,6 +5334,16 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} + '@irys/arweave@0.0.2': + dependencies: + asn1.js: 5.4.1 + async-retry: 1.3.3 + axios: 1.7.9 + base64-js: 1.5.1 + bignumber.js: 9.1.2 + transitivePeerDependencies: + - debug + '@irys/arweave@0.0.2(debug@4.4.0)': dependencies: asn1.js: 5.4.1 @@ -5208,7 +5364,7 @@ snapshots: '@irys/query@0.0.8': dependencies: async-retry: 1.3.3 - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 transitivePeerDependencies: - debug @@ -5263,7 +5419,7 @@ snapshots: algosdk: 1.24.1 arbundles: 0.11.2(arweave@1.15.5)(bufferutil@4.0.9)(utf-8-validate@5.0.10) async-retry: 1.3.3 - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 base64url: 3.0.1 bignumber.js: 9.1.2 bs58: 5.0.0 @@ -6150,7 +6306,7 @@ snapshots: dependencies: '@pythnetwork/price-service-sdk': 1.8.0 '@types/ws': 8.5.13 - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 axios-retry: 3.9.1 isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ts-log: 2.2.7 @@ -6204,7 +6360,7 @@ snapshots: '@solana/buffer-layout': 4.0.1 '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 big.js: 6.2.2 bn.js: 5.2.1 dayjs: 1.11.13 @@ -6293,6 +6449,14 @@ snapshots: '@shikijs/vscode-textmate@10.0.1': {} + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + '@sindresorhus/is@4.6.0': {} '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': @@ -6685,6 +6849,18 @@ snapshots: - encoding - utf-8-validate + '@solana/spl-token@0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + start-server-and-test: 1.15.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -7024,7 +7200,7 @@ snapshots: '@switchboard-xyz/common@2.5.12(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 big.js: 6.2.2 bn.js: 5.2.1 bs58: 6.0.0 @@ -7047,7 +7223,7 @@ snapshots: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@solworks/soltoolkit-sdk': 0.0.23(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) '@switchboard-xyz/common': 2.5.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 big.js: 6.2.2 bs58: 5.0.0 js-yaml: 4.1.0 @@ -7137,6 +7313,13 @@ snapshots: dependencies: '@grpc/grpc-js': 1.12.5 + '@ts-morph/common@0.19.0': + dependencies: + fast-glob: 3.3.2 + minimatch: 7.4.6 + mkdirp: 2.1.6 + path-browserify: 1.0.1 + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -7360,7 +7543,7 @@ snapshots: '@zodios/core@10.9.6(axios@1.7.9)(zod@3.24.1)': dependencies: - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 zod: 3.24.1 JSONStream@1.3.5: @@ -7436,6 +7619,23 @@ snapshots: '@solana/web3.js': 1.92.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) solana-bankrun: 0.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + anchor-client-gen@0.28.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@coral-xyz/anchor': 0.28.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + camelcase: 7.0.1 + commander: 10.0.1 + js-sha256: 0.9.0 + prettier: 2.8.8 + snake-case: 3.0.4 + ts-morph: 18.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -7503,7 +7703,7 @@ snapshots: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 - '@irys/arweave': 0.0.2(debug@4.4.0) + '@irys/arweave': 0.0.2 '@noble/ed25519': 1.7.3 base64url: 3.0.1 bs58: 4.0.1 @@ -7529,6 +7729,8 @@ snapshots: arg@4.1.3: {} + arg@5.0.2: {} + argparse@2.0.1: {} array-flatten@1.1.1: {} @@ -7579,6 +7781,13 @@ snapshots: '@babel/runtime': 7.26.0 is-retry-allowed: 2.2.0 + axios@0.27.2(debug@4.3.4): + dependencies: + follow-redirects: 1.15.9(debug@4.3.4) + form-data: 4.0.1 + transitivePeerDependencies: + - debug + axios@0.27.2(debug@4.4.0): dependencies: follow-redirects: 1.15.9(debug@4.4.0) @@ -7588,7 +7797,7 @@ snapshots: axios@0.28.1: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9 form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7596,7 +7805,15 @@ snapshots: axios@1.7.4: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7662,6 +7879,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bluebird@3.7.2: {} + bn.js@4.11.6: {} bn.js@4.12.1: {} @@ -7780,6 +7999,8 @@ snapshots: camelcase@6.3.0: {} + camelcase@7.0.1: {} + ccount@2.0.1: {} chai@5.1.2: @@ -7805,6 +8026,8 @@ snapshots: check-error@2.1.1: {} + check-more-types@2.24.0: {} + chownr@1.1.4: {} cipher-base@1.0.6: @@ -7843,6 +8066,8 @@ snapshots: clone@2.1.2: {} + code-block-writer@12.0.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -7939,6 +8164,10 @@ snapshots: dependencies: ms: 2.0.0 + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.4.0: dependencies: ms: 2.1.3 @@ -8020,6 +8249,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -8266,6 +8497,16 @@ snapshots: bn.js: 4.11.6 number-to-bn: 1.7.0 + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -8278,6 +8519,18 @@ snapshots: eventsource@2.0.2: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -8470,6 +8723,12 @@ snapshots: flatted@3.3.2: {} + follow-redirects@1.15.9: {} + + follow-redirects@1.15.9(debug@4.3.4): + optionalDependencies: + debug: 4.3.4 + follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: debug: 4.4.0 @@ -8510,6 +8769,8 @@ snapshots: fresh@0.5.2: {} + from@0.1.7: {} + fs-constants@1.0.0: {} fs.realpath@1.0.0: {} @@ -8547,6 +8808,8 @@ snapshots: dependencies: pump: 3.0.2 + get-stream@6.0.1: {} + get-stream@8.0.1: {} get-tsconfig@4.8.1: @@ -8713,6 +8976,8 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + human-signals@2.1.0: {} + human-signals@5.0.0: {} humanize-ms@1.2.1: @@ -8823,6 +9088,8 @@ snapshots: is-retry-allowed@2.2.0: {} + is-stream@2.0.1: {} + is-stream@3.0.0: {} is-typed-array@1.1.15: @@ -8886,6 +9153,14 @@ snapshots: - encoding - utf-8-validate + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + js-base64@3.7.7: {} js-sha256@0.11.0: {} @@ -8975,7 +9250,7 @@ snapshots: zod-to-json-schema: 3.24.1(zod@3.24.1) optionalDependencies: '@langchain/groq': 0.1.2(@langchain/core@0.3.27(openai@4.77.3(zod@3.24.1))) - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 transitivePeerDependencies: - encoding - openai @@ -8991,6 +9266,8 @@ snapshots: optionalDependencies: openai: 4.77.3(zod@3.24.1) + lazy-ass@1.6.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -9089,6 +9366,8 @@ snapshots: make-error@1.3.6: {} + map-stream@0.1.0: {} + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -9196,6 +9475,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -9208,8 +9491,12 @@ snapshots: mkdirp-classic@0.5.3: {} + mkdirp@2.1.6: {} + ms@2.0.0: {} + ms@2.1.2: {} + ms@2.1.3: {} multistream@4.1.0: @@ -9288,6 +9575,10 @@ snapshots: normalize-url@6.1.0: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -9418,6 +9709,8 @@ snapshots: parseurl@1.3.3: {} + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -9440,6 +9733,10 @@ snapshots: pathval@2.0.0: {} + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 @@ -9521,6 +9818,10 @@ snapshots: proxy-from-env@1.1.0: {} + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -9857,6 +10158,10 @@ snapshots: space-separated-tokens@2.0.2: {} + split@0.3.3: + dependencies: + through: 2.3.8 + spok@1.5.5: dependencies: ansicolors: 0.3.2 @@ -9865,10 +10170,27 @@ snapshots: - jiti - supports-color + start-server-and-test@1.15.4: + dependencies: + arg: 5.0.2 + bluebird: 3.7.2 + check-more-types: 2.24.0 + debug: 4.3.4 + execa: 5.1.1 + lazy-ass: 1.6.0 + ps-tree: 1.2.0 + wait-on: 7.0.1(debug@4.3.4) + transitivePeerDependencies: + - supports-color + statuses@1.5.0: {} statuses@2.0.1: {} + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + stream-transform@2.1.3: dependencies: mixme: 0.5.10 @@ -9914,6 +10236,8 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} strip-hex-prefix@1.0.0: @@ -10014,6 +10338,11 @@ snapshots: ts-log@2.2.7: {} + ts-morph@18.0.0: + dependencies: + '@ts-morph/common': 0.19.0 + code-block-writer: 12.0.0 + ts-node@10.9.2(@types/node@20.17.11)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -10233,6 +10562,16 @@ snapshots: vlq@2.0.4: {} + wait-on@7.0.1(debug@4.3.4): + dependencies: + axios: 0.27.2(debug@4.3.4) + joi: 17.13.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + wcwidth@1.0.1: dependencies: defaults: 1.0.4 diff --git a/src/agent/index.ts b/src/agent/index.ts index ea13c41..7cc32fa 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -651,6 +651,7 @@ export class SolanaAgentKit { collectionAccount: string, createItemOptions: CreateSingleOptions, isDevnet: boolean = false, + withPool: boolean = false, ): Promise { let optionsWithBase58: StoreInitOptions = { privateKey: this.wallet.secretKey, @@ -666,6 +667,7 @@ export class SolanaAgentKit { collectionAccount, createItemOptions, !isDevnet, + withPool, ); return `Transaction: ${tx}`; } diff --git a/src/langchain/3land/create_collection.ts b/src/langchain/3land/create_collection.ts index 111dd4c..490ab27 100644 --- a/src/langchain/3land/create_collection.ts +++ b/src/langchain/3land/create_collection.ts @@ -10,7 +10,6 @@ export class Solana3LandCreateCollection extends Tool { description = `Creates an NFT Collection that you can visit on 3.land's website (3.land/collection/{collectionAccount}) Inputs: - privateKey (required): represents the privateKey of the wallet - can be an array of numbers, Uint8Array or base58 string isMainnet (required): defines is the tx takes places in mainnet collectionSymbol (required): the symbol of the collection collectionName (required): the name of the collection @@ -26,14 +25,8 @@ export class Solana3LandCreateCollection extends Tool { protected async _call(input: string): Promise { try { const inputFormat = JSON.parse(input); - const privateKey = inputFormat.privateKey; const isMainnet = inputFormat.isMainnet; - const optionsWithBase58: StoreInitOptions = { - ...(privateKey && { privateKey }), - ...(isMainnet && { isMainnet }), - }; - const collectionSymbol = inputFormat?.collectionSymbol; const collectionName = inputFormat?.collectionName; const collectionDescription = inputFormat?.collectionDescription; @@ -49,8 +42,8 @@ export class Solana3LandCreateCollection extends Tool { }; const tx = await this.solanaKit.create3LandCollection( - optionsWithBase58, collectionOpts, + !isMainnet, ); return JSON.stringify({ status: "success", diff --git a/src/langchain/3land/create_single.ts b/src/langchain/3land/create_single.ts index 25db42e..13ec429 100644 --- a/src/langchain/3land/create_single.ts +++ b/src/langchain/3land/create_single.ts @@ -10,7 +10,6 @@ export class Solana3LandCreateSingle extends Tool { description = `Creates an NFT and lists it on 3.land's website Inputs: - privateKey (required): represents the privateKey of the wallet - can be an array of numbers, Uint8Array or base58 string collectionAccount (optional): represents the account for the nft collection itemName (required): the name of the NFT sellerFee (required): the fee of the seller @@ -21,7 +20,9 @@ export class Solana3LandCreateSingle extends Tool { mainImageUrl (required): the main image of the NFT coverImageUrl (optional): the cover image of the NFT splHash (optional): the hash of the spl token, if not provided listing will be in $SOL - isMainnet (required): defines is the tx takes places in mainnet + poolName (optional): the name of the pool + isMainnet (required): defines if the tx takes places in mainnet + withPool (optional): defines if minted edition will be tied to a liquidity pool `; constructor(private solanaKit: SolanaAgentKit) { @@ -31,13 +32,9 @@ export class Solana3LandCreateSingle extends Tool { protected async _call(input: string): Promise { try { const inputFormat = JSON.parse(input); - const privateKey = inputFormat.privateKey; const isMainnet = inputFormat.isMainnet; - - const optionsWithBase58: StoreInitOptions = { - ...(privateKey && { privateKey }), - ...(isMainnet && { isMainnet }), - }; + const withPool = inputFormat.withPool; + const poolName = inputFormat.poolName; const collectionAccount = inputFormat.collectionAccount; @@ -52,6 +49,15 @@ export class Solana3LandCreateSingle extends Tool { const coverImageUrl = inputFormat?.coverImageUrl; const splHash = inputFormat?.splHash; + if (withPool) { + if (!poolName) { + throw new Error("poolName is required when withPool is true"); + } + if (!splHash) { + throw new Error("splHash is required when withPool is true"); + } + } + const createItemOptions: CreateSingleOptions = { ...(itemName && { itemName }), ...(sellerFee && { sellerFee }), @@ -63,6 +69,7 @@ export class Solana3LandCreateSingle extends Tool { ...(mainImageUrl && { mainImageUrl }), ...(coverImageUrl && { coverImageUrl }), ...(splHash && { splHash }), + ...(poolName && { poolName }), }; if (!collectionAccount) { @@ -70,10 +77,10 @@ export class Solana3LandCreateSingle extends Tool { } const tx = await this.solanaKit.create3LandNft( - optionsWithBase58, collectionAccount, createItemOptions, - isMainnet, + !isMainnet, + withPool, ); return JSON.stringify({ status: "success", diff --git a/src/tools/3land/create_3land_collectible.ts b/src/tools/3land/create_3land_collectible.ts index 29295ab..1a45b85 100644 --- a/src/tools/3land/create_3land_collectible.ts +++ b/src/tools/3land/create_3land_collectible.ts @@ -37,7 +37,8 @@ export async function createSingle( optionsWithBase58: StoreInitOptions, collectionAccount: string, createItemOptions: CreateSingleOptions, - isMainnet: boolean, + isMainnet: boolean = false, + withPool: boolean = false, ) { try { const landStore = isMainnet @@ -49,6 +50,8 @@ export async function createSingle( landStore, collectionAccount, createItemOptions, + true, //isAI + withPool, ); return singleEditionTx; } catch (error: any) { diff --git a/test/tools/3land.ts b/test/tools/3land.ts index b482312..3e4c0f7 100644 --- a/test/tools/3land.ts +++ b/test/tools/3land.ts @@ -38,19 +38,24 @@ const collectionAccount = ""; const createItemOptions: CreateSingleOptions = { itemName: "", sellerFee: 500, //5% - itemAmount: 100, + itemAmount: 333, itemSymbol: "", itemDescription: "", traits: [{ trait_type: "", value: "" }], - price: 0, //100000000 == 0.1 sol + price: 100000000, //100000000 == 0.1 sol, + splHash: "", + poolName: "", mainImageUrl: "", }; +const withPool = true; + (async () => { const result = agent.create3LandNft( collectionAccount, createItemOptions, isDevnet, + withPool, ); console.log("result: ", result); })();