diff --git a/.env.example b/.env.example index e2a6d1a..1f3564b 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,3 @@ OPENAI_API_KEY= -HELIUS_API_KEY= -SOLANA_PRIVATE_KEY= \ No newline at end of file +RPC_URL= +SOLANA_PRIVATE_KEY= diff --git a/README.md b/README.md index 6654b85..2013b60 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,9 @@ import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit"; // Initialize with private key and optional RPC URL const agent = new SolanaAgentKit( - "your-wallet-private-key-as-base58", - "https://api.mainnet-beta.solana.com", - "your-openai-api-key" + "your-wallet-private-key-as-base58", + "https://api.mainnet-beta.solana.com", + "your-openai-api-key" ); // Create LangChain tools @@ -61,9 +61,9 @@ const tools = createSolanaTools(agent); import { deploy_token } from "solana-agent-kit"; const result = await deploy_token( - agent, - 9, // decimals - 1000000 // initial supply + agent, + 9, // decimals + 1000000 // initial supply ); console.log("Token Mint Address:", result.mint.toString()); @@ -75,15 +75,15 @@ console.log("Token Mint Address:", result.mint.toString()); import { deploy_collection } from "solana-agent-kit"; const collection = await deploy_collection(agent, { - name: "My NFT Collection", - uri: "https://arweave.net/metadata.json", - royaltyBasisPoints: 500, // 5% - creators: [ - { - address: "creator-wallet-address", - percentage: 100, - }, - ], + name: "My NFT Collection", + uri: "https://arweave.net/metadata.json", + royaltyBasisPoints: 500, // 5% + creators: [ + { + address: "creator-wallet-address", + percentage: 100, + }, + ], }); ``` @@ -94,11 +94,11 @@ import { trade } from "solana-agent-kit"; import { PublicKey } from "@solana/web3.js"; const signature = await trade( - agent, - new PublicKey("target-token-mint"), - 100, // amount - new PublicKey("source-token-mint"), - 300 // 3% slippage + agent, + new PublicKey("target-token-mint"), + 100, // amount + new PublicKey("source-token-mint"), + 300 // 3% slippage ); ``` @@ -109,8 +109,8 @@ import { lendAsset } from "solana-agent-kit"; import { PublicKey } from "@solana/web3.js"; const signature = await lendAsset( - agent, - 100 // amount + agent, + 100 // amount ); ``` @@ -120,8 +120,8 @@ const signature = await lendAsset( import { stakeWithJup } from "solana-agent-kit"; const signature = await stakeWithJup( - agent, - 1 // amount in SOL + agent, + 1 // amount in SOL ); ``` @@ -131,20 +131,51 @@ const signature = await stakeWithJup( import { fetchPrice } from "solana-agent-kit"; const price = await fetchPrice( - agent, - "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" // Token mint address + agent, + "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" // Token mint address ); console.log("Price in USDC:", price); ``` +### Send an SPL Token Airdrop via ZK Compression + +```typescript +import { + sendCompressedAirdrop, + getAirdropCostEstimate, +} from "solana-agent-kit"; +import { PublicKey } from "@solana/web3.js"; + +(async () => { + console.log( + "~Airdrop cost estimate:", + getAirdropCostEstimate( + 1000, // recipients + 30_000 // priority fee in lamports + ) + ); + + const signature = await sendCompressedAirdrop( + agent, + new PublicKey("JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"), // mint + 42, // amount per recipient + [ + new PublicKey("1nc1nerator11111111111111111111111111111111"), + // ... add more recipients + ], + 30_000 // priority fee in lamports + ); +})(); +``` + ## API Reference ### Core Functions -#### `deploy_token(agent, decimals?, initialSupply?)` +#### `deploy_token(agent, decimals?, name, uri, symbol, initialSupply?)` -Deploy a new SPL token with optional initial supply. +Deploy a new SPL token with optional initial supply. If not specified, decimals default to 9. #### `deploy_collection(agent, options)` @@ -174,6 +205,10 @@ Lend idle assets to earn interest with Lulo. Stake SOL with Jupiter to earn rewards. +#### `sendCompressedAirdrop(agent, mintAddress, amount, recipients, priorityFeeInLamports?, shouldLog?)` + +Send an SPL token airdrop to many recipients at low cost via ZK Compression. + ## Dependencies The toolkit relies on several key Solana and Metaplex libraries: @@ -181,7 +216,10 @@ The toolkit relies on several key Solana and Metaplex libraries: - @solana/web3.js - @solana/spl-token - @metaplex-foundation/mpl-token-metadata +- @metaplex-foundation/mpl-core - @metaplex-foundation/umi +- @lightprotocol/compressed-token +- @lightprotocol/stateless.js ## Contributing diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 2708636..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -solanaagentkit.xyz \ No newline at end of file diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 42ae6d9..73cf8f1 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE4XSTUsDQQwG4P+S8+Ji0SJ7K5ZerB/o3sTDMGbdodlk2GRAkf53qRXt4nR6mUveeUJInj/B8N2ggSchx27xhmw3waCC6KyHBjw5VdR6Wj/rbSCoYBP4FZrz2dW2+pWuhQi9BeElRpKPAfnAC2w4ds6j1rngFJ5dzrPwfdy9ekL9SRXJEZ3JmIf2tdL3dSJZeC+JbYnmAukjahRWzIrH46Umt4Htb6i7VVvscTRdavGQhtglXrvEvi/y2eQpepW4lQ0W15bJlVi/Ww7uj7IVoQO0S/w9u9b/QlNxfrF9+QJeMbLbAQMAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE4XTQUvDMBTA8e+Sc7E4dEhvw9KDzm1ob+IhxNc1LH0vJC+gyL67bBNdXfZ26SX//l4T0tcvxfDBqlIv5DTq2RqQHy2rQnnNvaqUcTpGiOV4/arnwalCbSy+q+p6crctfqV7cg4MW8IavKPPAfDIs8gQOm0glrlwDE9up1l46XfPeEH9qUQygGYKeeiwJr3eAJt+FayBZ4ieMEJWOs0k9CF5yxBa2gDWmnWW/B9J4Dw5mhlDCbkG1tZF8WvP59KQJ4v8d/SLphVnnK2lEas0+C7hXCc0vchny0t0k3B/nNLlynQSa3ZXCA6/TkvkjtAu4X7vsTyJxuL0Zvv2DYU9ByOnAwAA" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index ba76e21..0ec3fb6 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/SolanaAgentKit.html b/docs/classes/SolanaAgentKit.html index 554183d..b19a16b 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, and trading

SolanaAgentKit

-

Constructors

Constructors

  • Parameters

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

    Returns SolanaAgentKit

Properties

connection: Connection

Solana RPC connection

-
openai_api_key: string
wallet: Keypair

Wallet keypair for signing transactions

-
wallet_address: PublicKey

Public key of the wallet

-

Methods

  • Parameters

    • decimals: number = DEFAULT_OPTIONS.TOKEN_DECIMALS

    Returns Promise<{
        mint: PublicKey;
    }>

  • Parameters

    • Optionaltoken_address: PublicKey

    Returns Promise<null | number>

  • Parameters

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

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

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

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

    Returns Promise<MintCollectionNFTResponse>

  • Parameters

    • name: string
    • OptionalspaceKB: number

    Returns Promise<string>

  • Returns Promise<string>

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

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

    Returns Promise<string>

  • Parameters

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

    Returns Promise<string>

+

Constructors

  • Parameters

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

    Returns SolanaAgentKit

Properties

connection: Connection

Solana RPC connection

+
openai_api_key: string
wallet: Keypair

Wallet keypair for signing transactions

+
wallet_address: PublicKey

Public key of the wallet

+

Methods

  • Parameters

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

    Returns Promise<{
        mint: PublicKey;
    }>

  • Parameters

    • Optionaltoken_address: PublicKey

    Returns Promise<null | number>

  • Parameters

    • account: PublicKey

    Returns Promise<string>

  • Parameters

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

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

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

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

    Returns Promise<MintCollectionNFTResponse>

  • Parameters

    • name: string
    • OptionalspaceKB: number

    Returns Promise<string>

  • Returns Promise<string>

  • Parameters

    • domain: string

    Returns Promise<PublicKey>

  • Parameters

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

    Returns Promise<string[]>

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

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

    Returns Promise<string>

  • Parameters

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

    Returns Promise<string>

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

Function createSolanaTools

  • Parameters

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

+createSolanaTools | solana-agent-kit

Function createSolanaTools

  • Parameters

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

diff --git a/docs/index.html b/docs/index.html index d3bb75a..e7acd0e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -42,25 +42,31 @@
npm install solana-agent-kit
 
-
import { SolanaAgentKit, createSolanaTools } from 'solana-agent-kit';

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

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

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

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

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

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

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

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

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

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

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

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

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

const signature = await lendAsset(
agent,
100 // amount
);
-
import { stakeWithJup } from 'solana-agent-kit';

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

const signature = await stakeWithJup(
agent,
1 // amount in SOL
);
-

Deploy a new SPL token with optional initial supply.

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

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

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

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

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

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

Create a new NFT collection with customizable metadata and royalties.

Mint a new NFT as part of an existing collection.

Transfer SOL or SPL tokens to a recipient.

@@ -68,14 +74,18 @@

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

Lend idle assets to earn interest with Lulo.

Stake SOL with Jupiter to earn rewards.

+

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

The toolkit relies on several key Solana and Metaplex libraries:

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

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

ISC License

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

-
+
diff --git a/docs/interfaces/CollectionDeployment.html b/docs/interfaces/CollectionDeployment.html index 61bc317..f1e8d56 100644 --- a/docs/interfaces/CollectionDeployment.html +++ b/docs/interfaces/CollectionDeployment.html @@ -1,3 +1,3 @@ -CollectionDeployment | solana-agent-kit

Interface CollectionDeployment

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

Properties

collectionAddress +CollectionDeployment | solana-agent-kit

Interface CollectionDeployment

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

Properties

collectionAddress: PublicKey
signature: Uint8Array
+

Properties

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

Interface CollectionOptions

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

Properties

creators? +CollectionOptions | solana-agent-kit

Interface CollectionOptions

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

Properties

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

Properties

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

Interface Creator

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

Properties

address +Creator | solana-agent-kit

Interface Creator

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

Properties

Properties

address: string
percentage: number
+

Properties

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

Interface FetchPriceResponse

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

Properties

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

Interface JupiterTokenData

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

Properties

address: string
daily_volume: number
decimals: number
extensions: {
    coingeckoId?: string;
}
freeze_authority: null | string
logoURI: string
mint_authority: null | string
name: string
permanent_delegate: null | string
symbol: string
tags: string[]
diff --git a/docs/interfaces/LuloAccountDetailsResponse.html b/docs/interfaces/LuloAccountDetailsResponse.html index d276b4c..fbbd796 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 d007719..340e447 100644 --- a/docs/interfaces/MintCollectionNFTResponse.html +++ b/docs/interfaces/MintCollectionNFTResponse.html @@ -1,3 +1,3 @@ -MintCollectionNFTResponse | solana-agent-kit

Interface MintCollectionNFTResponse

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

Properties

metadata +MintCollectionNFTResponse | solana-agent-kit

Interface MintCollectionNFTResponse

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

Properties

Properties

metadata: PublicKey
mint: PublicKey
+

Properties

metadata: PublicKey
mint: PublicKey
diff --git a/docs/interfaces/PumpFunTokenOptions.html b/docs/interfaces/PumpFunTokenOptions.html index f9246b3..4a914f5 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 ebf722d..f8db007 100644 --- a/docs/interfaces/PumpfunLaunchResponse.html +++ b/docs/interfaces/PumpfunLaunchResponse.html @@ -1,5 +1,5 @@ -PumpfunLaunchResponse | solana-agent-kit

Interface PumpfunLaunchResponse

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

Properties

error? +PumpfunLaunchResponse | solana-agent-kit

Interface PumpfunLaunchResponse

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

Properties

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

Properties

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

Interfaces

CollectionDeployment CollectionOptions Creator +FetchPriceResponse +JupiterTokenData LuloAccountDetailsResponse MintCollectionNFTResponse PumpfunLaunchResponse diff --git a/guides/add_your_own_tool.md b/guides/add_your_own_tool.md new file mode 100644 index 0000000..63d1172 --- /dev/null +++ b/guides/add_your_own_tool.md @@ -0,0 +1,179 @@ +# How to Add Your Own Tool + +Extending the **Solana Agent Kit** with custom tools allows you to add specialized functionalities tailored to your needs. This guide walks you through creating and integrating a new tool into the existing framework. + +## Overview + +1. Create a new tool file +2. Implement the tool class +3. Implement supporting functions in SolanaAgentKit +4. Export the new tool +5. Integrate the tool into the agent +6. Use the custom tool + +## Implementation Guide + +### 1. Create a New Tool File + +Create a new TypeScript file in the `src/tools/` directory for your tool (e.g., `custom_tool.ts`). + +### 2. Implement the Tool Class + +```typescript:src/tools/custom_tool.ts +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../agent"; + +export class CustomTool extends Tool { + name = "custom_tool"; + description = "Description of what the custom tool does."; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const result = await this.solanaKit.customFunction(input); + return JSON.stringify({ + status: "success", + message: "Custom tool executed successfully", + data: result, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} +``` + +### 3. Add Supporting Functions to SolanaAgentKit + +```typescript:src/agent/index.ts +export class SolanaAgentKit { + // ... existing code ... + + async customFunction(input: string): Promise { + // Implement your custom functionality + return `Processed input: ${input}`; + } +} +``` + +### 4. Export the Tool + +```typescript:src/tools/index.ts +export * from "./request_faucet_funds"; +export * from "./deploy_token"; +export * from "./custom_tool"; // Add your new tool +``` + +### 5. Integrate with Agent + +```typescript:src/langchain/index.ts +import { CustomTool } from "../tools/custom_tool"; + +export function createSolanaTools(agent: SolanaAgentKit) { + return [ + // ... existing tools ... + new CustomTool(agent), + ]; +} +``` + +### 6. Usage Example + +```typescript +import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit"; + +const agent = new SolanaAgentKit( + "your-wallet-private-key-as-base58", + "https://api.mainnet-beta.solana.com", + "your-openai-api-key" +); + +const tools = createSolanaTools(agent); +const customTool = tools.find(tool => tool.name === "custom_tool"); + +if (customTool) { + const result = await customTool._call("your-input"); + console.log(result); +} +``` + +## Best Practices + +- Implement robust error handling +- Add security checks for sensitive operations +- Document your tool's purpose and usage +- Write tests for reliability +- Keep tools focused on single responsibilities + +## Example: Token Price Fetching Tool + +Here's a complete example of implementing a tool to fetch token prices: + +```typescript:src/tools/fetch_token_price.ts +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../agent"; + +export class FetchTokenPriceTool extends Tool { + name = "fetch_token_price"; + description = "Fetches the current price of a specified token."; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(tokenSymbol: string): Promise { + try { + const price = await this.solanaKit.getTokenPrice(tokenSymbol); + return JSON.stringify({ + status: "success", + message: `Price fetched successfully for ${tokenSymbol}.`, + data: { token: tokenSymbol, price }, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} +``` + +Add the supporting function to SolanaAgentKit: + +```typescript:src/agent/index.ts +export class SolanaAgentKit { + async getTokenPrice(tokenSymbol: string): Promise { + const mockPrices: { [key: string]: number } = { + SOL: 150, + USDC: 1, + USDT: 1, + BONK: 0.5, + }; + + if (!mockPrices[tokenSymbol.toUpperCase()]) { + throw new Error(`Price for token symbol ${tokenSymbol} not found.`); + } + + return mockPrices[tokenSymbol.toUpperCase()]; + } +} +``` + +## Need Help? + +If you encounter any issues while implementing your custom tool: + +- Open an issue in the repository +- Contact the maintainer +- Check existing tools for implementation examples + +--- \ No newline at end of file diff --git a/guides/setup_locally.md b/guides/setup_locally.md new file mode 100644 index 0000000..8acfd1e --- /dev/null +++ b/guides/setup_locally.md @@ -0,0 +1,83 @@ +# How to Setup Locally + +Setting up the **Solana Agent Kit** on your local machine involves cloning the repository, installing dependencies, configuring environment variables, and building the project. Follow the steps below to get started. + +## Prerequisites + +- **Node**: Ensure you have Node version 23.x or higher installed. You can download it from [Node Official Website](https://nodejs.org/). +- **Package Manager**: Node's package manager comes bundled with Node. Verify installation by running `npm -v`. +- **Git**: Ensure Git is installed and configured. Download from [Git Official Website](https://git-scm.com/). + +## Step-by-Step Guide + +1. **Clone the Repository** + ```bash + git clone https://github.com/yourusername/solana-agent-kit.git + ``` + +2. **Navigate to the Project Directory** + ```bash + cd solana-agent-kit + ``` + +3. **Install Dependencies** + + The project uses `pnpm` for package management. Install all necessary dependencies by running: + ```bash + pnpm install + ``` + +4. **Configure Environment Variables** + + Create a `.env` file in the root directory of the project to store your environment variables securely. This file should include the following variables: + ```env + OPENAI_API_KEY=your_openai_api_key_here + RPC_URL=your_rpc_url + SOLANA_PRIVATE_KEY=your_solana_private_key_here + ``` + + - **OPENAI_API_KEY**: Your OpenAI API key for generating images and interacting with OpenAI services. + - **RPC_URL**: Your RPC_URL for Solana blockchain interactions. + - **SOLANA_PRIVATE_KEY**: Your Solana wallet's private key in base58 format. + + **Note:** Ensure that the `.env` file is added to `.gitignore` to prevent exposing sensitive information. + +5. **Build the Project** + + Compile the TypeScript code to JavaScript using the build script: + ```bash + pnpm run build + ``` + + This will generate the compiled files in the `dist/` directory. + +6. **Generate Documentation (Optional)** + + If you wish to generate the project documentation, use the following command: + ```bash + pnpm run docs + ``` + + The documentation will be available in the `docs/` directory. + +--- + +**Additional Information:** + +- **Git Configuration:** Ensure that Git is properly configured with your user name and email. You can set them using: + ```bash + git config --global user.name "Your Name" + git config --global user.email "your.email@example.com" + ``` + +- **Verifying Installation:** + + After installing dependencies and building the project, you can verify the installation by running: + ```bash + pnpm run build + pnpm run test + ``` + + Ensure that all tests pass successfully. + +--- \ No newline at end of file diff --git a/guides/test_it_out.md b/guides/test_it_out.md new file mode 100644 index 0000000..02f8151 --- /dev/null +++ b/guides/test_it_out.md @@ -0,0 +1,107 @@ +# How to Test It Out + +Testing the **Solana Agent Kit** ensures that all functionalities are working as expected. You can run automated tests or interact with the agent in different modes to verify its operations. + +## Running Automated Tests + +The project includes a test script located at `test/index.ts`. To execute the tests: + +1. **Ensure Dependencies are Installed** + - If you haven't installed the dependencies yet, refer to the [Setup Locally](./setup_locally.md) guide. + +2. **Run the Test Script** + ```bash + pnpm run test + ``` + This will run the `test/index.ts` script using `ts-node`. Ensure that your environment variables are correctly set in the `.env` file before running the tests. + +## Interactive Modes + +### Available Modes +1. **Chat Mode** + - Allows you to interact with the agent in a conversational manner. + +2. **Autonomous Mode** + - Enables the agent to perform actions on the blockchain autonomously at regular intervals. + +### Starting the Agent + +1. **Launch the Agent** + ```bash + pnpm start + ``` + +2. **Select Your Mode** + - For Chat Mode: Enter `1` or `chat` + - For Autonomous Mode: Enter `2` or `auto` + +### Using Each Mode + +#### Chat Mode +- Start chatting by entering prompts after the `Prompt:` indicator +- Type `exit` to end the chat session + +#### Autonomous Mode +- The agent executes predefined actions every 10 seconds +- Actions and outputs are displayed in the console + +## Code Examples + +### Token Deployment +```typescript +import { deploy_token } from "solana-agent-kit"; + +const result = await deploy_token( + agent, + 9, // decimals + 1000000 // initial supply +); + +console.log("Token Mint Address:", result.mint.toString()); +``` + +### NFT Collection Creation +```typescript +import { deploy_collection } from "solana-agent-kit"; + +const collection = await deploy_collection(agent, { + name: "My NFT Collection", + uri: "https://arweave.net/metadata.json", + royaltyBasisPoints: 500, // 5% + creators: [ + { + address: "creator-wallet-address", + percentage: 100, + }, + ], +}); +``` + +## Best Practices + +### Environment Setup +- Verify `.env` file contains correct and secure values +- Ensure all required environment variables are set + +### Testing +- Maintain comprehensive test coverage +- Monitor console logs during testing +- Clean up test assets after deployment + +## Troubleshooting + +### Test Failures + +#### Missing Environment Variables +- **Issue:** Tests fail due to missing environment variables +- **Solution:** Check `.env` file for all required variables + +#### Network Problems +- **Issue:** Network-related errors +- **Solution:** Verify internet connection and Solana RPC endpoint accessibility + +### Agent Issues + +#### Startup Problems +- **Issue:** Agent doesn't prompt for mode selection +- **Solution:** Verify successful build and dependency installation \ No newline at end of file diff --git a/package.json b/package.json index dc05a55..a1170a8 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "@langchain/groq": "^0.1.2", "@langchain/langgraph": "^0.2.27", "@langchain/openai": "^0.3.13", + "@lightprotocol/compressed-token": "^0.17.1", + "@lightprotocol/stateless.js": "^0.17.1", "@metaplex-foundation/mpl-core": "^1.1.1", "@metaplex-foundation/mpl-token-metadata": "^3.3.0", "@metaplex-foundation/umi": "^0.9.2", @@ -39,6 +41,7 @@ }, "devDependencies": { "@types/node": "^22.9.0", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "typescript": "^5.7.2" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60c0cfb..13834e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,25 +10,28 @@ importers: dependencies: '@bonfida/spl-name-service': specifier: ^3.0.7 - version: 3.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(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) + version: 3.0.7(@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) '@langchain/core': specifier: ^0.3.18 - version: 0.3.18(openai@4.75.0(zod@3.23.8)) + version: 0.3.23(openai@4.76.3(zod@3.24.1)) '@langchain/groq': specifier: ^0.1.2 - version: 0.1.2(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) + version: 0.1.2(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) '@langchain/langgraph': specifier: ^0.2.27 - version: 0.2.27(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) + version: 0.2.33(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) '@langchain/openai': specifier: ^0.3.13 - version: 0.3.13(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) + version: 0.3.14(@langchain/core@0.3.23(openai@4.76.3(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.5.0) + 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) @@ -37,22 +40,16 @@ importers: version: 0.9.2 '@metaplex-foundation/umi-bundle-defaults': specifier: ^0.9.2 - version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(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.95.4(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.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(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.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(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.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3) + version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@solana/spl-token': specifier: ^0.4.9 - version: 0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + version: 0.4.9(@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': specifier: ^1.95.4 - version: 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) bs58: specifier: ^6.0.0 version: 6.0.0 @@ -61,26 +58,29 @@ importers: version: 10.4.3 dotenv: specifier: ^16.4.5 - version: 16.4.5 + version: 16.4.7 form-data: specifier: ^4.0.1 version: 4.0.1 langchain: specifier: ^0.3.6 - version: 0.3.6(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))(@langchain/groq@0.1.2(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))))(axios@1.7.7)(openai@4.75.0(zod@3.23.8)) + version: 0.3.7(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))(@langchain/groq@0.1.2(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))))(openai@4.76.3(zod@3.24.1)) openai: specifier: ^4.75.0 - version: 4.75.0(zod@3.23.8) + version: 4.76.3(zod@3.24.1) typedoc: specifier: ^0.26.11 - version: 0.26.11(typescript@5.6.3) + version: 0.26.11(typescript@5.7.2) devDependencies: '@types/node': specifier: ^22.9.0 - version: 22.9.0 + version: 22.10.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) + version: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) + typescript: + specifier: ^5.7.2 + version: 5.7.2 packages: @@ -98,6 +98,9 @@ packages: peerDependencies: '@solana/web3.js': ^1.87.3 + '@cfworker/json-schema@4.0.3': + resolution: {integrity: sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==} + '@coral-xyz/anchor@0.29.0': resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} engines: {node: '>=11'} @@ -122,8 +125,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@langchain/core@0.3.18': - resolution: {integrity: sha512-IEZCrFs1Xd0J2FTH1D3Lnm3/Yk2r8LSpwDeLYwcCom3rNAK5k4mKQ2rwIpNq3YuqBdrTNMKRO+PopjkP1SB17A==} + '@langchain/core@0.3.23': + resolution: {integrity: sha512-Aut43dEJYH/ibccSErFOLQzymkBG4emlN16P0OHWwx02bDosOR9ilZly4JJiCSYcprn2X2H8nee6P/4VMg1oQA==} engines: {node: '>=18'} '@langchain/groq@0.1.2': @@ -138,17 +141,17 @@ packages: peerDependencies: '@langchain/core': '>=0.2.31 <0.4.0' - '@langchain/langgraph-sdk@0.0.31': - resolution: {integrity: sha512-oYZWoC3x7vH9bAL1Y30XjtuWnic1j3knXD4BbldsY0chFLxwIT5i6/GMThNy3Oiwb4SB+c6gvaSuxBNDkp7dkw==} + '@langchain/langgraph-sdk@0.0.32': + resolution: {integrity: sha512-KQyM9kLO7T6AxwNrceajH7JOybP3pYpvUPnhiI2rrVndI1WyZUJ1eVC1e722BVRAPi6o+WcoTT4uMSZVinPOtA==} - '@langchain/langgraph@0.2.27': - resolution: {integrity: sha512-7+PlVXlNpswzXzZp/k8O99YBN3zBkUdusfyxISkZ/gdXz1p5RySQEpKQ4EVIZnzBrZ98zZ3FArj4OWOgeF0EeA==} + '@langchain/langgraph@0.2.33': + resolution: {integrity: sha512-Tx2eU98XicIOoZzRkzQqLxZrF93B9xONYmWSq3kfDUoC0nzQbkydpygF1MTcUM9hKPQsSGMBrxgXht5+sNXzYg==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.36 <0.3.0 || >=0.3.9 < 0.4.0' - '@langchain/openai@0.3.13': - resolution: {integrity: sha512-lfiauYttb1Vv1GVGDNZlse8475RUsKm9JJ7X9kMVtYoOQnK8xxzMVSrpW7HYLmJokrtVgF6STwRzNJI2gZ3uBw==} + '@langchain/openai@0.3.14': + resolution: {integrity: sha512-lNWjUo1tbvsss45IF7UQtMu1NJ6oUKvhgPYWXnX9f/d6OmuLu7D99HQ3Y88vLcUo9XjjOy417olYHignMduMjA==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.26 <0.4.0' @@ -159,6 +162,14 @@ packages: 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/mpl-core@1.1.1': resolution: {integrity: sha512-h1kLw+cGaV8SiykoHDb1/G01+VYqtJXAt0uGuO5+2Towsdtc6ET4M62iqUnh4EacTVMIW1yYHsKsG/LYWBCKaA==} peerDependencies: @@ -255,47 +266,39 @@ packages: resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} engines: {node: '>= 14'} - '@noble/curves@1.6.0': - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.5.0': resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} engines: {node: ^14.21.3 || >=16} - '@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 + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} - '@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 + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} - '@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==} - '@shikijs/core@1.23.0': - resolution: {integrity: sha512-J4Fo22oBlfRHAXec+1AEzcowv+Qdf4ZQkuP/X/UHYH9+KA9LvyFXSXyS+HxuBRFfon+u7bsmKdRBjoZlbDVRkQ==} + '@shikijs/core@1.24.2': + resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} - '@shikijs/engine-javascript@1.23.0': - resolution: {integrity: sha512-CcrppseWShG+8Efp1iil9divltuXVdCaU4iu+CKvzTGZO5RmXyAiSx668M7VbX8+s/vt1ZKu75Vn/jWi8O3G/Q==} + '@shikijs/engine-javascript@1.24.2': + resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} - '@shikijs/engine-oniguruma@1.23.0': - resolution: {integrity: sha512-gS8bZLqVvmZXX+E5JUMJICsBp+kx6gj79MH/UEpKHKIqnUzppgbmEn6zLa6mB5D+sHse2gFei3YYJxQe1EzZXQ==} + '@shikijs/engine-oniguruma@1.24.2': + resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} - '@shikijs/types@1.23.0': - resolution: {integrity: sha512-HiwzsihRao+IbPk7FER/EQT/D0dEEK3n5LAtHDzL5iRT+JMblA7y9uitUnjEnHeLkKigNM+ZplrP7MuEyyc5kA==} + '@shikijs/types@1.24.2': + resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@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==} @@ -308,6 +311,11 @@ packages: '@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: @@ -316,6 +324,11 @@ packages: '@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: @@ -324,6 +337,11 @@ packages: '@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: @@ -334,6 +352,12 @@ packages: 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: @@ -343,6 +367,11 @@ packages: '@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: @@ -352,6 +381,12 @@ packages: 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 @@ -361,6 +396,11 @@ packages: '@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: @@ -372,6 +412,12 @@ packages: 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'} @@ -390,6 +436,12 @@ packages: 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'} @@ -400,8 +452,11 @@ packages: resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} engines: {node: '>=16'} - '@solana/web3.js@1.95.4': - resolution: {integrity: sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==} + '@solana/web3.js@1.95.3': + resolution: {integrity: sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==} + + '@solana/web3.js@1.95.8': + resolution: {integrity: sha512-sBHzNh7dHMrmNS5xPD1d0Xa2QffW/RXaxu/OysRXBfwTp+LYqGGmMtCYYwrHPrN5rjAmJCsQRNAwv4FM0t3B6g==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -436,11 +491,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.64': - resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} + '@types/node@18.19.68': + resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} - '@types/node@22.9.0': - resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -460,8 +515,8 @@ packages: '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -497,9 +552,6 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -634,8 +686,8 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} emoji-regex-xs@1.0.0: @@ -674,15 +726,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} @@ -700,8 +743,8 @@ packages: groq-sdk@0.5.0: resolution: {integrity: sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==} - hast-util-to-html@9.0.3: - resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + 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==} @@ -724,8 +767,8 @@ packages: peerDependencies: ws: '*' - jayson@4.1.2: - resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==} + jayson@4.1.3: + resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} engines: {node: '>=8'} hasBin: true @@ -750,8 +793,8 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - langchain@0.3.6: - resolution: {integrity: sha512-erZOIKXzwCOrQHqY9AyjkQmaX62zUap1Sigw1KrwMUOnVoLKkVNRmAyxFlNZDZ9jLs/58MaQcaT9ReJtbj3x6w==} + langchain@0.3.7: + resolution: {integrity: sha512-6/Gkk9Zez3HkbsETFxZVo1iKLmaK3OzkDseC5MYFKVmYFDXFAOyJR3srJ9P61xF8heVdsPixqYIsejBn7/9dXg==} engines: {node: '>=18'} peerDependencies: '@langchain/anthropic': '*' @@ -796,8 +839,8 @@ packages: typeorm: optional: true - langsmith@0.2.5: - resolution: {integrity: sha512-dA+l7ZEh1Q9Q9FcE39PUSSEMfsFo73R2V81fRo5KSlGNcypOEhoQvv6lbjyZP7MHmt3/9pPcfpuRd5Y4RbFYqQ==} + langsmith@0.2.13: + resolution: {integrity: sha512-16EOM5nhU6GlMCKGm5sgBIAKOKzS2d30qcDZmF21kSLZJiUhUNTROwvYdqgZLrGfIIzmSMJHCKA7RFd5qf50uw==} peerDependencies: openai: '*' peerDependenciesMeta: @@ -876,15 +919,15 @@ packages: encoding: optional: true - node-gyp-build@4.8.3: - resolution: {integrity: sha512-EMS95CMJzdoSKoIiXo8pxKoL8DYxwIZXYlLmgPb8KUv794abpnLK6ynsCAWNliOjREKruYKdzbh76HHYUHX7nw==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - oniguruma-to-es@0.1.2: - resolution: {integrity: sha512-sBYKVJlIMB0WPO+tSu/NNB1ytSFeHyyJZ3Ayxfx3f/QUuXu0lvZk0VB4K7npmdlHSC0ldqanzh/sUSlAbgCTfw==} + oniguruma-to-es@0.7.0: + resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} - openai@4.75.0: - resolution: {integrity: sha512-8cWaK3td0qLspaflKWD6AvpQnl0gynWFbHg7sMAgiu//F20I4GJlCCpllDrECO6WFSuY8HXJj8gji3urw2BGGg==} + openai@4.76.3: + resolution: {integrity: sha512-BISkI90m8zT7BAMljK0j00TzOoLvmc7AulPxv6EARa++3+hhIK5G6z4xkITurEaA9bvDhQ09kSNKA3DL+rDMwA==} hasBin: true peerDependencies: zod: ^3.23.8 @@ -920,9 +963,6 @@ packages: 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'} @@ -934,14 +974,14 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@4.2.1: - resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} + regex-recursion@4.3.0: + resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@4.4.0: - resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} @@ -958,8 +998,8 @@ packages: engines: {node: '>=10'} hasBin: true - shiki@1.23.0: - resolution: {integrity: sha512-xfdu9DqPkIpExH29cmiTlgo0/jBki5la1Tkfhsv+Wu5TT3APLNHslR1acxuKJOCWqVdSc+pIbs/2ozjVRGppdg==} + shiki@1.24.2: + resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -986,9 +1026,6 @@ packages: 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==} - toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} @@ -1015,6 +1052,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + typedoc@0.26.11: resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} engines: {node: '>= 18'} @@ -1022,8 +1062,8 @@ packages: peerDependencies: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} hasBin: true @@ -1033,8 +1073,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + 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==} @@ -1117,8 +1157,8 @@ packages: utf-8-validate: optional: true - yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} hasBin: true @@ -1126,13 +1166,13 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - zod-to-json-schema@3.23.5: - resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} peerDependencies: - zod: ^3.23.3 + zod: ^3.24.1 - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -1143,20 +1183,20 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@bonfida/sns-records@0.0.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@bonfida/sns-records@0.0.1(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.95.4(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) borsh: 1.0.0 bs58: 5.0.0 buffer: 6.0.3 - '@bonfida/spl-name-service@3.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@bonfida/spl-name-service@3.0.7(@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: - '@bonfida/sns-records': 0.0.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@noble/curves': 1.6.0 - '@scure/base': 1.1.9 - '@solana/spl-token': 0.4.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@bonfida/sns-records': 0.0.1(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/curves': 1.7.0 + '@scure/base': 1.2.1 + '@solana/spl-token': 0.4.6(@solana/web3.js@1.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) borsh: 2.0.0 buffer: 6.0.3 graphemesplit: 2.4.4 @@ -1169,11 +1209,13 @@ snapshots: - typescript - utf-8-validate + '@cfworker/json-schema@4.0.3': {} + '@coral-xyz/anchor@0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@noble/hashes': 1.5.0 - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.6.1 + '@solana/web3.js': 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 @@ -1190,9 +1232,9 @@ snapshots: - encoding - utf-8-validate - '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.95.4(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) bn.js: 5.2.1 buffer-layout: 1.2.2 @@ -1209,72 +1251,101 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))': + '@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))': dependencies: + '@cfworker/json-schema': 4.0.3 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.15 - langsmith: 0.2.5(openai@4.75.0(zod@3.23.8)) + langsmith: 0.2.13(openai@4.76.3(zod@3.24.1)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) transitivePeerDependencies: - openai - '@langchain/groq@0.1.2(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))': + '@langchain/groq@0.1.2(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))': dependencies: - '@langchain/core': 0.3.18(openai@4.75.0(zod@3.23.8)) - '@langchain/openai': 0.3.13(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) + '@langchain/core': 0.3.23(openai@4.76.3(zod@3.24.1)) + '@langchain/openai': 0.3.14(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) groq-sdk: 0.5.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) transitivePeerDependencies: - encoding - '@langchain/langgraph-checkpoint@0.0.13(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))': + '@langchain/langgraph-checkpoint@0.0.13(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))': dependencies: - '@langchain/core': 0.3.18(openai@4.75.0(zod@3.23.8)) + '@langchain/core': 0.3.23(openai@4.76.3(zod@3.24.1)) uuid: 10.0.0 - '@langchain/langgraph-sdk@0.0.31': + '@langchain/langgraph-sdk@0.0.32': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 - '@langchain/langgraph@0.2.27(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))': + '@langchain/langgraph@0.2.33(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))': dependencies: - '@langchain/core': 0.3.18(openai@4.75.0(zod@3.23.8)) - '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) - '@langchain/langgraph-sdk': 0.0.31 + '@langchain/core': 0.3.23(openai@4.76.3(zod@3.24.1)) + '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) + '@langchain/langgraph-sdk': 0.0.32 uuid: 10.0.0 - zod: 3.23.8 + zod: 3.24.1 - '@langchain/openai@0.3.13(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))': + '@langchain/openai@0.3.14(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))': dependencies: - '@langchain/core': 0.3.18(openai@4.75.0(zod@3.23.8)) + '@langchain/core': 0.3.23(openai@4.76.3(zod@3.24.1)) js-tiktoken: 1.0.15 - openai: 4.75.0(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + openai: 4.76.3(zod@3.24.1) + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) transitivePeerDependencies: - encoding - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))': + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))': dependencies: - '@langchain/core': 0.3.18(openai@4.75.0(zod@3.23.8)) + '@langchain/core': 0.3.23(openai@4.76.3(zod@3.24.1)) js-tiktoken: 1.0.15 - '@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.5.0)': + '@lightprotocol/compressed-token@0.17.1(@lightprotocol/stateless.js@0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@lightprotocol/stateless.js': 0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.8(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@lightprotocol/stateless.js@0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@noble/hashes': 1.5.0 + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + superstruct: 2.0.2 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.1)': dependencies: '@metaplex-foundation/umi': 0.9.2 '@msgpack/msgpack': 3.0.0-beta2 - '@noble/hashes': 1.5.0 + '@noble/hashes': 1.6.1 '@metaplex-foundation/mpl-token-metadata@3.3.0(@metaplex-foundation/umi@0.9.2)': dependencies: @@ -1285,18 +1356,18 @@ snapshots: dependencies: '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-downloader-http': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@metaplex-foundation/umi-http-fetch': 0.9.2(@metaplex-foundation/umi@0.9.2) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) '@metaplex-foundation/umi-rpc-chunk-get-accounts': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@metaplex-foundation/umi-serializer-data-view': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@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) transitivePeerDependencies: - encoding @@ -1304,12 +1375,12 @@ snapshots: dependencies: '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-eddsa-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@metaplex-foundation/umi-eddsa-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@noble/curves': 1.6.0 - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/curves': 1.7.0 + '@solana/web3.js': 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metaplex-foundation/umi-http-fetch@0.9.2(@metaplex-foundation/umi@0.9.2)': dependencies: @@ -1332,11 +1403,11 @@ snapshots: dependencies: '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-rpc-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@metaplex-foundation/umi-rpc-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.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) '@metaplex-foundation/umi-serializer-data-view@0.9.2(@metaplex-foundation/umi@0.9.2)': dependencies: @@ -1360,16 +1431,16 @@ snapshots: '@metaplex-foundation/umi-serializers-encodings': 0.8.9 '@metaplex-foundation/umi-serializers-numbers': 0.8.9 - '@metaplex-foundation/umi-transaction-factory-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@metaplex-foundation/umi-transaction-factory-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.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) - '@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@metaplex-foundation/umi': 0.9.2 - '@solana/web3.js': 1.95.4(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 '@metaplex-foundation/umi@0.9.2': @@ -1380,61 +1451,49 @@ snapshots: '@msgpack/msgpack@3.0.0-beta2': {} - '@noble/curves@1.6.0': + '@noble/curves@1.7.0': dependencies: - '@noble/hashes': 1.5.0 + '@noble/hashes': 1.6.0 '@noble/hashes@1.5.0': {} - '@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3)': - dependencies: - '@solana/spl-token': 0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) - decimal.js: 10.4.3 - tiny-invariant: 1.3.3 + '@noble/hashes@1.6.0': {} - '@orca-so/whirlpools-sdk@0.13.12(@coral-xyz/anchor@0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(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.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3)': - dependencies: - '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@orca-so/common-sdk': 0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(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.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) - decimal.js: 10.4.3 - tiny-invariant: 1.3.3 + '@noble/hashes@1.6.1': {} - '@scure/base@1.1.9': {} + '@scure/base@1.2.1': {} - '@shikijs/core@1.23.0': + '@shikijs/core@1.24.2': dependencies: - '@shikijs/engine-javascript': 1.23.0 - '@shikijs/engine-oniguruma': 1.23.0 - '@shikijs/types': 1.23.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - hast-util-to-html: 9.0.3 + hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.23.0': + '@shikijs/engine-javascript@1.24.2': dependencies: - '@shikijs/types': 1.23.0 - '@shikijs/vscode-textmate': 9.3.0 - oniguruma-to-es: 0.1.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.7.0 - '@shikijs/engine-oniguruma@1.23.0': + '@shikijs/engine-oniguruma@1.24.2': dependencies: - '@shikijs/types': 1.23.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 - '@shikijs/types@1.23.0': + '@shikijs/types@1.24.2': dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/vscode-textmate@9.3.1': {} '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.95.4(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) bigint-buffer: 1.1.5 bignumber.js: 9.1.2 transitivePeerDependencies: @@ -1450,10 +1509,15 @@ snapshots: dependencies: '@solana/errors': 2.0.0-preview.2 - '@solana/codecs-core@2.0.0-rc.1(typescript@5.6.3)': + '@solana/codecs-core@2.0.0-preview.4(typescript@5.7.2)': dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-core@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 '@solana/codecs-data-structures@2.0.0-preview.2': dependencies: @@ -1461,23 +1525,36 @@ snapshots: '@solana/codecs-numbers': 2.0.0-preview.2 '@solana/errors': 2.0.0-preview.2 - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.6.3)': + '@solana/codecs-data-structures@2.0.0-preview.4(typescript@5.7.2)': 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-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 '@solana/codecs-numbers@2.0.0-preview.2': dependencies: '@solana/codecs-core': 2.0.0-preview.2 '@solana/errors': 2.0.0-preview.2 - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.6.3)': + '@solana/codecs-numbers@2.0.0-preview.4(typescript@5.7.2)': 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-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': dependencies: @@ -1486,13 +1563,21 @@ snapshots: '@solana/errors': 2.0.0-preview.2 fastestsmallesttextencoderdecoder: 1.0.22 - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + '@solana/codecs-strings@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': 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) + '@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.6.3 + typescript: 5.7.2 + + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.7.2 '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': dependencies: @@ -1504,14 +1589,25 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + '@solana/codecs@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': 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 + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/options': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - fastestsmallesttextencoderdecoder @@ -1520,59 +1616,93 @@ snapshots: chalk: 5.3.0 commander: 12.1.0 - '@solana/errors@2.0.0-rc.1(typescript@5.6.3)': + '@solana/errors@2.0.0-preview.4(typescript@5.7.2)': dependencies: chalk: 5.3.0 commander: 12.1.0 - typescript: 5.6.3 + typescript: 5.7.2 + + '@solana/errors@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + typescript: 5.7.2 '@solana/options@2.0.0-preview.2': dependencies: '@solana/codecs-core': 2.0.0-preview.2 '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + '@solana/options@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': 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 + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/spl-token-group@0.0.4(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)': + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/spl-token-group@0.0.4(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)': dependencies: '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.95.4(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) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/spl-token-group@0.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + '@solana/spl-token-group@0.0.5(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/codecs': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-type-length-value': 0.1.0 + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + '@solana/spl-token-group@0.0.7(@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.6.3) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token@0.4.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.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.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.4.6(@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.8)(utf-8-validate@5.0.10) - '@solana/spl-token-group': 0.0.4(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.4(@solana/web3.js@1.95.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.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 @@ -1581,13 +1711,28 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@solana/spl-token@0.4.8(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(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.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.5(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-token@0.4.9(@solana/web3.js@1.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.8)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.7(@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/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 @@ -1600,11 +1745,11 @@ snapshots: dependencies: buffer: 6.0.3 - '@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.26.0 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.5.0 bigint-buffer: 1.1.5 @@ -1613,7 +1758,29 @@ snapshots: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.2(bufferutil@4.0.8)(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 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@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.7.0 + '@noble/hashes': 1.6.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) node-fetch: 2.7.0 rpc-websockets: 9.0.4 superstruct: 2.0.2 @@ -1636,7 +1803,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.9.0 + '@types/node': 22.10.2 '@types/hast@3.0.4': dependencies: @@ -1650,18 +1817,18 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.9.0 + '@types/node': 22.10.2 form-data: 4.0.1 '@types/node@12.20.55': {} - '@types/node@18.19.64': + '@types/node@18.19.68': dependencies: undici-types: 5.26.5 - '@types/node@22.9.0': + '@types/node@22.10.2': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/retry@0.12.0': {} @@ -1673,13 +1840,13 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 22.9.0 + '@types/node': 22.10.2 '@types/ws@8.5.13': dependencies: - '@types/node': 22.9.0 + '@types/node': 22.10.2 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.2.1': {} JSONStream@1.3.5: dependencies: @@ -1708,15 +1875,6 @@ snapshots: asynckit@0.4.0: {} - axios@1.7.7: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - optional: true - balanced-match@1.0.2: {} base-x@3.0.10: @@ -1776,7 +1934,7 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.8.3 + node-gyp-build: 4.8.4 optional: true camelcase@6.3.0: {} @@ -1832,7 +1990,7 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - dotenv@16.4.5: {} + dotenv@16.4.7: {} emoji-regex-xs@1.0.0: {} @@ -1858,9 +2016,6 @@ snapshots: file-uri-to-path@1.0.0: {} - follow-redirects@1.15.9: - optional: true - form-data-encoder@1.7.2: {} form-data@4.0.1: @@ -1881,7 +2036,7 @@ snapshots: groq-sdk@0.5.0: dependencies: - '@types/node': 18.19.64 + '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -1892,7 +2047,7 @@ snapshots: transitivePeerDependencies: - encoding - hast-util-to-html@9.0.3: + hast-util-to-html@9.0.4: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -1924,7 +2079,7 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - jayson@4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + jayson@4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 '@types/node': 12.20.55 @@ -1958,29 +2113,28 @@ snapshots: jsonpointer@5.0.1: {} - langchain@0.3.6(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8)))(@langchain/groq@0.1.2(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))))(axios@1.7.7)(openai@4.75.0(zod@3.23.8)): + langchain@0.3.7(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1)))(@langchain/groq@0.1.2(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))))(openai@4.76.3(zod@3.24.1)): dependencies: - '@langchain/core': 0.3.18(openai@4.75.0(zod@3.23.8)) - '@langchain/openai': 0.3.13(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) + '@langchain/core': 0.3.23(openai@4.76.3(zod@3.24.1)) + '@langchain/openai': 0.3.14(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) js-tiktoken: 1.0.15 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.2.5(openai@4.75.0(zod@3.23.8)) + langsmith: 0.2.13(openai@4.76.3(zod@3.24.1)) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 - yaml: 2.6.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + yaml: 2.6.1 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) optionalDependencies: - '@langchain/groq': 0.1.2(@langchain/core@0.3.18(openai@4.75.0(zod@3.23.8))) - axios: 1.7.7 + '@langchain/groq': 0.1.2(@langchain/core@0.3.23(openai@4.76.3(zod@3.24.1))) transitivePeerDependencies: - encoding - openai - langsmith@0.2.5(openai@4.75.0(zod@3.23.8)): + langsmith@0.2.13(openai@4.76.3(zod@3.24.1)): dependencies: '@types/uuid': 10.0.0 commander: 10.0.1 @@ -1989,7 +2143,7 @@ snapshots: semver: 7.6.3 uuid: 10.0.0 optionalDependencies: - openai: 4.75.0(zod@3.23.8) + openai: 4.76.3(zod@3.24.1) linkify-it@5.0.0: dependencies: @@ -2016,7 +2170,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.1 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -2068,18 +2222,18 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-gyp-build@4.8.3: + node-gyp-build@4.8.4: optional: true - oniguruma-to-es@0.1.2: + oniguruma-to-es@0.7.0: dependencies: emoji-regex-xs: 1.0.0 - regex: 4.4.0 - regex-recursion: 4.2.1 + regex: 5.0.2 + regex-recursion: 4.3.0 - openai@4.75.0(zod@3.23.8): + openai@4.76.3(zod@3.24.1): dependencies: - '@types/node': 18.19.64 + '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -2087,7 +2241,7 @@ snapshots: formdata-node: 4.4.1 node-fetch: 2.7.0 optionalDependencies: - zod: 3.23.8 + zod: 3.24.1 transitivePeerDependencies: - encoding @@ -2115,22 +2269,21 @@ snapshots: property-information@6.5.0: {} - proxy-from-env@1.1.0: - optional: true - punycode.js@2.3.1: {} punycode@2.3.1: {} regenerator-runtime@0.14.1: {} - regex-recursion@4.2.1: + regex-recursion@4.3.0: dependencies: regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@4.4.0: {} + regex@5.0.2: + dependencies: + regex-utilities: 2.3.0 retry@0.13.1: {} @@ -2151,13 +2304,13 @@ snapshots: semver@7.6.3: {} - shiki@1.23.0: + shiki@1.24.2: dependencies: - '@shikijs/core': 1.23.0 - '@shikijs/engine-javascript': 1.23.0 - '@shikijs/engine-oniguruma': 1.23.0 - '@shikijs/types': 1.23.0 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/core': 1.24.2 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 snake-case@3.0.4: @@ -2182,50 +2335,50 @@ snapshots: tiny-inflate@1.0.3: {} - tiny-invariant@1.3.3: {} - toml@3.0.0: {} tr46@0.0.3: {} trim-lines@3.0.1: {} - ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3): + ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.9.0 + '@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.6.3 + typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 tslib@2.8.1: {} - typedoc@0.26.11(typescript@5.6.3): + tweetnacl@1.0.3: {} + + typedoc@0.26.11(typescript@5.7.2): dependencies: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.23.0 - typescript: 5.6.3 - yaml: 2.6.0 + shiki: 1.24.2 + typescript: 5.7.2 + yaml: 2.6.1 - typescript@5.6.3: {} + typescript@5.7.2: {} uc.micro@2.1.0: {} undici-types@5.26.5: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} unicode-trie@2.0.0: dependencies: @@ -2257,7 +2410,7 @@ snapshots: utf-8-validate@5.0.10: dependencies: - node-gyp-build: 4.8.3 + node-gyp-build: 4.8.4 optional: true uuid@10.0.0: {} @@ -2299,14 +2452,14 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - yaml@2.6.0: {} + yaml@2.6.1: {} yn@3.1.1: {} - zod-to-json-schema@3.23.5(zod@3.23.8): + zod-to-json-schema@3.24.1(zod@3.24.1): dependencies: - zod: 3.23.8 + zod: 3.24.1 - zod@3.23.8: {} + zod@3.24.1: {} zwitch@2.0.4: {} diff --git a/src/agent/index.ts b/src/agent/index.ts index d987b29..847eb2e 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -9,10 +9,15 @@ import { transfer, trade, registerDomain, + resolveSolDomain, + getPrimaryDomain, launchPumpFunToken, lendAsset, getTPS, + getTokenDataByAddress, + getTokenDataByTicker, stakeWithJup, + sendCompressedAirdrop, createOrcaSingleSidedWhirlpool, FEE_TIERS } from "../tools"; @@ -39,7 +44,7 @@ export class SolanaAgentKit { constructor( private_key: string, rpc_url = "https://api.mainnet-beta.solana.com", - openai_api_key: string, + openai_api_key: string ) { this.connection = new Connection(rpc_url); this.wallet = Keypair.fromSecretKey(bs58.decode(private_key)); @@ -53,10 +58,13 @@ export class SolanaAgentKit { } async deployToken( + name: string, + uri: string, + symbol: string, decimals: number = DEFAULT_OPTIONS.TOKEN_DECIMALS, - // initialSupply?: number + initialSupply?: number ) { - return deploy_token(this, decimals); + return deploy_token(this, name, uri, symbol, decimals, initialSupply); } async deployCollection(options: CollectionOptions) { @@ -70,7 +78,7 @@ export class SolanaAgentKit { async mintNFT( collectionMint: PublicKey, metadata: Parameters[2], - recipient?: PublicKey, + recipient?: PublicKey ) { return mintCollectionNFT(this, collectionMint, metadata, recipient); } @@ -83,11 +91,19 @@ export class SolanaAgentKit { return registerDomain(this, name, spaceKB); } + async resolveSolDomain(domain: string) { + return resolveSolDomain(this, domain); + } + + async getPrimaryDomain(account: PublicKey) { + return getPrimaryDomain(this, account); + } + async trade( outputMint: PublicKey, inputAmount: number, inputMint?: PublicKey, - slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS, + slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS ) { return trade(this, outputMint, inputAmount, inputMint, slippageBps); } @@ -100,12 +116,20 @@ export class SolanaAgentKit { return getTPS(this); } + async getTokenDataByAddress(mint: string) { + return getTokenDataByAddress(new PublicKey(mint)); + } + + async getTokenDataByTicker(ticker: string) { + return getTokenDataByTicker(ticker); + } + async launchPumpFunToken( tokenName: string, tokenTicker: string, description: string, imageUrl: string, - options?: PumpFunTokenOptions, + options?: PumpFunTokenOptions ) { return launchPumpFunToken( this, @@ -113,16 +137,33 @@ export class SolanaAgentKit { tokenTicker, description, imageUrl, - options, + options ); } - - async stake( - amount: number, - ) { + + async stake(amount: number) { return stakeWithJup(this, amount); } + async sendCompressedAirdrop( + mintAddress: string, + amount: number, + decimals: number, + recipients: string[], + priorityFeeInLamports: number, + shouldLog: boolean + ): Promise { + return await sendCompressedAirdrop( + this, + new PublicKey(mintAddress), + amount, + decimals, + recipients.map((recipient) => new PublicKey(recipient)), + priorityFeeInLamports, + shouldLog + ); + } + async createOrcaSingleSidedWhirlpool( depositTokenAmount: BN, depositTokenMint: PublicKey, diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 17ce444..20991f7 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -90,38 +90,30 @@ export class SolanaTransferTool extends Tool { export class SolanaDeployTokenTool extends Tool { name = "solana_deploy_token"; - description = - "Deploy a new SPL token. Input should be JSON string with: {decimals?: number, initialSupply?: number}"; + description = `Deploy a new token on Solana blockchain. + + Inputs (input is a JSON string): + name: string, eg "My Token" (required) + uri: string, eg "https://example.com/token.json" (required) + symbol: string, eg "MTK" (required) + decimals?: number, eg 9 (optional, defaults to 9) + initialSupply?: number, eg 1000000 (optional)`; constructor(private solanaKit: SolanaAgentKit) { super(); } - private validateInput(input: any): void { - if ( - input.decimals !== undefined && - (typeof input.decimals !== "number" || - input.decimals < 0 || - input.decimals > 9) - ) { - throw new Error( - "decimals must be a number between 0 and 9 when provided" - ); - } - if ( - input.initialSupply !== undefined && - (typeof input.initialSupply !== "number" || input.initialSupply <= 0) - ) { - throw new Error("initialSupply must be a positive number when provided"); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = toJSON(input); - this.validateInput(parsedInput); + const parsedInput = JSON.parse(input); - const result = await this.solanaKit.deployToken(parsedInput.decimals); + const result = await this.solanaKit.deployToken( + parsedInput.name, + parsedInput.uri, + parsedInput.symbol, + parsedInput.decimals, + parsedInput.initialSupply + ); return JSON.stringify({ status: "success", @@ -141,57 +133,20 @@ export class SolanaDeployTokenTool extends Tool { export class SolanaDeployCollectionTool extends Tool { name = "solana_deploy_collection"; - description = - "Deploy a new NFT collection. Input should be JSON with: {name: string, uri: string, royaltyBasisPoints?: number, creators?: Array<{address: string, percentage: number}>}"; + description = `Deploy a new NFT collection on Solana blockchain. + + Inputs (input is a JSON string): + name: string, eg "My Collection" (required) + uri: string, eg "https://example.com/collection.json" (required) + royaltyBasisPoints?: number, eg 500 for 5% (optional)`; constructor(private solanaKit: SolanaAgentKit) { super(); } - private validateInput(input: any): void { - if (!input.name || typeof input.name !== "string") { - throw new Error("name is required and must be a string"); - } - if (!input.uri || typeof input.uri !== "string") { - throw new Error("uri is required and must be a string"); - } - if ( - input.royaltyBasisPoints !== undefined && - (typeof input.royaltyBasisPoints !== "number" || - input.royaltyBasisPoints < 0 || - input.royaltyBasisPoints > 10000) - ) { - throw new Error( - "royaltyBasisPoints must be a number between 0 and 10000 when provided" - ); - } - if (input.creators) { - if (!Array.isArray(input.creators)) { - throw new Error("creators must be an array when provided"); - } - input.creators.forEach((creator: any, index: number) => { - if (!creator.address || typeof creator.address !== "string") { - throw new Error( - `creator[${index}].address is required and must be a string` - ); - } - if ( - typeof creator.percentage !== "number" || - creator.percentage < 0 || - creator.percentage > 100 - ) { - throw new Error( - `creator[${index}].percentage must be a number between 0 and 100` - ); - } - }); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = toJSON(input); - this.validateInput(parsedInput); + const parsedInput = JSON.parse(input); const result = await this.solanaKit.deployCollection(parsedInput); @@ -213,50 +168,42 @@ export class SolanaDeployCollectionTool extends Tool { export class SolanaMintNFTTool extends Tool { name = "solana_mint_nft"; - description = - "Mint a new NFT in a collection. Input should be JSON with: {collectionMint: string, metadata: {name: string, symbol: string, uri: string}, recipient?: string}"; + description = `Mint a new NFT in a collection on Solana blockchain. + + Inputs (input is a JSON string): + collectionMint: string, eg "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w" (required) - The address of the collection to mint into + name: string, eg "My NFT" (required) + uri: string, eg "https://example.com/nft.json" (required) + recipient?: string, eg "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u" (optional) - The wallet to receive the NFT, defaults to agent's wallet which is ${this.solanaKit.wallet_address.toString()}`; constructor(private solanaKit: SolanaAgentKit) { super(); } - private validateInput(input: any): void { - if (!input.collectionMint || typeof input.collectionMint !== "string") { - throw new Error("collectionMint is required and must be a string"); - } - if (!input.metadata || typeof input.metadata !== "object") { - throw new Error("metadata is required and must be an object"); - } - if (!input.metadata.name || typeof input.metadata.name !== "string") { - throw new Error("metadata.name is required and must be a string"); - } - if (!input.metadata.symbol || typeof input.metadata.symbol !== "string") { - throw new Error("metadata.symbol is required and must be a string"); - } - if (!input.metadata.uri || typeof input.metadata.uri !== "string") { - throw new Error("metadata.uri is required and must be a string"); - } - if (input.recipient !== undefined && typeof input.recipient !== "string") { - throw new Error("recipient must be a string when provided"); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = toJSON(input); - this.validateInput(parsedInput); + const parsedInput = JSON.parse(input); const result = await this.solanaKit.mintNFT( new PublicKey(parsedInput.collectionMint), - parsedInput.metadata, - parsedInput.recipient ? new PublicKey(parsedInput.recipient) : undefined + { + name: parsedInput.name, + uri: parsedInput.uri, + }, + parsedInput.recipient + ? new PublicKey(parsedInput.recipient) + : this.solanaKit.wallet_address ); return JSON.stringify({ status: "success", message: "NFT minted successfully", mintAddress: result.mint.toString(), - name: parsedInput.metadata.name, + metadata: { + name: parsedInput.name, + symbol: parsedInput.symbol, + uri: parsedInput.uri, + }, recipient: parsedInput.recipient || result.mint.toString(), }); } catch (error: any) { @@ -393,6 +340,70 @@ export class SolanaRegisterDomainTool extends Tool { } } +export class SolanaResolveDomainTool extends Tool { + name = "solana_resolve_domain"; + description = `Resolve a .sol domain to a Solana PublicKey. + + Inputs: + domain: string, eg "pumpfun.sol" or "pumpfun"(required) + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const domain = input.trim(); + const publicKey = await this.solanaKit.resolveSolDomain(domain); + + return JSON.stringify({ + status: "success", + message: "Domain resolved successfully", + publicKey: publicKey.toBase58(), + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaGetDomainTool extends Tool { + name = "solana_get_domain"; + description = `Retrieve the .sol domain associated for a given account address. + + Inputs: + account: string, eg "4Be9CvxqHW6BYiRAxW9Q3xu1ycTMWaL5z8NX4HR3ha7t" (required) + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const account = new PublicKey(input.trim()); + const domain = await this.solanaKit.getPrimaryDomain(account); + + return JSON.stringify({ + status: "success", + message: "Primary domain retrieved successfully", + domain, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + export class SolanaGetWalletAddressTool extends Tool { name = "solana_get_wallet_address"; description = `Get the wallet address of the agent`; @@ -634,6 +645,110 @@ export class SolanaFetchPriceTool extends Tool { } } +export class SolanaTokenDataTool extends Tool { + name = "solana_token_data"; + description = `Get the token data for a given token mint address + + Inputs: mintAddress is required. + mintAddress: string, eg "So11111111111111111111111111111111111111112" (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = input.trim(); + + const tokenData = await this.solanaKit.getTokenDataByAddress(parsedInput); + + return JSON.stringify({ + status: "success", + tokenData: tokenData, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaTokenDataByTickerTool extends Tool { + name = "solana_token_data_by_ticker"; + description = `Get the token data for a given token ticker + + Inputs: ticker is required. + ticker: string, eg "USDC" (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const ticker = input.trim(); + const tokenData = await this.solanaKit.getTokenDataByTicker(ticker); + return JSON.stringify({ + status: "success", + tokenData: tokenData, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaCompressedAirdropTool extends Tool { + name = "solana_compressed_airdrop"; + description = `Airdrop SPL tokens with ZK Compression (also called as airdropping tokens) + + Inputs (input is a JSON string): + mintAddress: string, the mint address of the token, e.g., "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" (required) + amount: number, the amount of tokens to airdrop per recipient, e.g., 42 (required) + decimals: number, the decimals of the token, e.g., 6 (required) + recipients: string[], the recipient addresses, e.g., ["1nc1nerator11111111111111111111111111111111"] (required) + priorityFeeInLamports: number, the priority fee in lamports. Default is 30_000. (optional) + shouldLog: boolean, whether to log progress to stdout. Default is false. (optional)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + + const txs = await this.solanaKit.sendCompressedAirdrop( + parsedInput.mintAddress, + parsedInput.amount, + parsedInput.decimals, + parsedInput.recipients, + parsedInput.priorityFeeInLamports || 30_000, + parsedInput.shouldLog || false + ); + + return JSON.stringify({ + status: "success", + message: `Airdropped ${parsedInput.amount} tokens to ${parsedInput.recipients.length} recipients.`, + transactionHashes: txs, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + export class SolanaCreateSingleSidedWhirlpoolTool extends Tool { name = "create_orca_single_sided_whirlpool"; description = `Create a single-sided Whirlpool with liquidity. @@ -706,5 +821,10 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaTPSCalculatorTool(solanaKit), new SolanaStakeTool(solanaKit), new SolanaFetchPriceTool(solanaKit), + new SolanaResolveDomainTool(solanaKit), + new SolanaGetDomainTool(solanaKit), + new SolanaTokenDataTool(solanaKit), + new SolanaTokenDataByTickerTool(solanaKit), + new SolanaCompressedAirdropTool(solanaKit), ]; } diff --git a/src/tools/create_orca_single_sided_whirlpool.ts b/src/tools/create_orca_single_sided_whirlpool.ts index 8f7835a..ad3f025 100644 --- a/src/tools/create_orca_single_sided_whirlpool.ts +++ b/src/tools/create_orca_single_sided_whirlpool.ts @@ -243,7 +243,7 @@ export async function createOrcaSingleSidedWhirlpool( const tickUpperInitializableIndex = TickUtil.getInitializableTickIndex(tickUpperIndex, tickSpacing); if (!TickUtil.checkTickInBounds(tickLowerInitializableIndex) || !TickUtil.checkTickInBounds(tickUpperInitializableIndex)) throw Error('Prices out of bounds'); const increasLiquidityQuoteParam: IncreaseLiquidityQuoteParam = { - inputTokenAmount: BN(depositTokenAmount), + inputTokenAmount: new BN(depositTokenAmount), inputTokenMint: depositTokenMint, tokenMintA: mintA, tokenMintB: mintB, diff --git a/src/tools/deploy_collection.ts b/src/tools/deploy_collection.ts index 9317348..4528b92 100644 --- a/src/tools/deploy_collection.ts +++ b/src/tools/deploy_collection.ts @@ -1,9 +1,9 @@ import { SolanaAgentKit } from "../index"; -import { createUmi, generateSigner, publicKey } from "@metaplex-foundation/umi"; -import { createCollection, ruleSet } from "@metaplex-foundation/mpl-core"; -import { mplTokenMetadata } from "@metaplex-foundation/mpl-token-metadata"; +import { generateSigner, keypairIdentity, publicKey } from "@metaplex-foundation/umi"; +import { createCollection, mplCore, ruleSet } from "@metaplex-foundation/mpl-core"; import { CollectionOptions, CollectionDeployment } from "../types"; -import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; +import { fromWeb3JsKeypair, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; +import { createUmi } from "@metaplex-foundation/umi-bundle-defaults"; /** * Deploy a new NFT collection @@ -17,7 +17,8 @@ export async function deploy_collection( ): Promise { try { // Initialize Umi - const umi = createUmi().use(mplTokenMetadata()); + const umi = createUmi(agent.connection.rpcEndpoint).use(mplCore()); + umi.use(keypairIdentity(fromWeb3JsKeypair(agent.wallet))); // Generate collection signer const collectionSigner = generateSigner(umi); @@ -27,11 +28,11 @@ export async function deploy_collection( address: publicKey(creator.address), percentage: creator.percentage, })) || [ - { - address: publicKey(agent.wallet_address.toString()), - percentage: 100, - }, - ]; + { + address: publicKey(agent.wallet_address.toString()), + percentage: 100, + }, + ]; // Create collection const tx = await createCollection(umi, { diff --git a/src/tools/deploy_token.ts b/src/tools/deploy_token.ts index 4b0b497..a36d5de 100644 --- a/src/tools/deploy_token.ts +++ b/src/tools/deploy_token.ts @@ -1,57 +1,66 @@ import { SolanaAgentKit } from "../index"; -import { - createInitializeMint2Instruction, - MINT_SIZE, - getMinimumBalanceForRentExemptAccount, - TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; -import { Keypair, SystemProgram, Transaction } from "@solana/web3.js"; -import { sendTx } from "../utils/send_tx"; +import { PublicKey } from "@solana/web3.js"; +import { createUmi } from "@metaplex-foundation/umi-bundle-defaults"; +import { generateSigner, keypairIdentity } from "@metaplex-foundation/umi"; +import { createFungible, mintV1, TokenStandard } from "@metaplex-foundation/mpl-token-metadata"; +import { fromWeb3JsKeypair, fromWeb3JsPublicKey, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; /** * Deploy a new SPL token * @param agent SolanaAgentKit instance + * @param name Name of the token + * @param uri URI for the token metadata + * @param symbol Symbol of the token * @param decimals Number of decimals for the token (default: 9) * @param initialSupply Initial supply to mint (optional) * @returns Object containing token mint address and initial account (if supply was minted) */ export async function deploy_token( agent: SolanaAgentKit, - decimals: number = 9 - // initialSupply?: number -) { + name: string, + uri: string, + symbol: string, + decimals: number = 9, + initialSupply?: number +): Promise<{ mint: PublicKey }> { try { - // Create new token mint - const lamports = await getMinimumBalanceForRentExemptAccount( - agent.connection - ); + // Create UMI instance from agent + const umi = createUmi(agent.connection.rpcEndpoint) + umi.use(keypairIdentity(fromWeb3JsKeypair(agent.wallet))); - const mint = Keypair.generate(); - let account_create_ix = SystemProgram.createAccount({ - fromPubkey: agent.wallet_address, - newAccountPubkey: mint.publicKey, - lamports, - space: MINT_SIZE, - programId: TOKEN_PROGRAM_ID, + // Create new token mint + const mint = generateSigner(umi); + + let builder = createFungible(umi, { + name, + uri, + symbol, + sellerFeeBasisPoints: { + basisPoints: 0n, + identifier: "%", + decimals: 2, + }, + decimals, + mint, }); - let create_mint_ix = createInitializeMint2Instruction( - mint.publicKey, - decimals, - agent.wallet_address, - agent.wallet_address, - TOKEN_PROGRAM_ID - ); + if (initialSupply) { + builder = builder.add( + mintV1(umi, { + mint: mint.publicKey, + tokenStandard: TokenStandard.Fungible, + tokenOwner: fromWeb3JsPublicKey(agent.wallet_address), + amount: initialSupply, + }) + ); + } - let tx = new Transaction().add(account_create_ix, create_mint_ix); - - let hash = await sendTx(agent, tx, [mint]); + builder.sendAndConfirm(umi, { confirm: { commitment: 'finalized' } }); return { - mint: mint.publicKey, + mint: toWeb3JsPublicKey(mint.publicKey), }; } catch (error: any) { - console.log(error); throw new Error(`Token deployment failed: ${error.message}`); } } diff --git a/src/tools/get_primary_domain.ts b/src/tools/get_primary_domain.ts new file mode 100644 index 0000000..775af4b --- /dev/null +++ b/src/tools/get_primary_domain.ts @@ -0,0 +1,37 @@ +import { getPrimaryDomain as _getPrimaryDomain } from "@bonfida/spl-name-service"; +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../index"; + +/** + * Retrieves the primary .sol domain associated with a given Solana public key. + * + * This function queries the Bonfida SPL Name Service to get the primary .sol domain for + * a specified Solana public key. If the primary domain is stale or an error occurs during + * the resolution, it throws an error. + * + * @param agent SolanaAgentKit instance + * @param account The Solana public key for which to retrieve the primary domain + * @returns A promise that resolves to the primary .sol domain as a string + * @throws Error if the domain is stale or if the domain resolution fails + */ +export async function getPrimaryDomain( + agent: SolanaAgentKit, + account: PublicKey +): Promise { + try { + const { reverse, stale } = await _getPrimaryDomain( + agent.connection, + account + ); + if (stale) { + throw new Error( + `Primary domain is stale for account: ${account.toBase58()}` + ); + } + return reverse; + } catch (error) { + throw new Error( + `Failed to get primary domain for account: ${account.toBase58()}` + ); + } +} diff --git a/src/tools/get_token_data.ts b/src/tools/get_token_data.ts new file mode 100644 index 0000000..110a801 --- /dev/null +++ b/src/tools/get_token_data.ts @@ -0,0 +1,68 @@ +import { PublicKey } from "@solana/web3.js"; +import { JupiterTokenData } from "../types"; + +export async function getTokenDataByAddress( + mint: PublicKey, +): Promise { + try { + if (!mint) { + throw new Error("Mint address is required"); + } + + const response = await fetch("https://tokens.jup.ag/tokens?tags=verified", { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + const data = (await response.json()) as JupiterTokenData[]; + const token = data.find((token: JupiterTokenData) => { + return token.address === mint.toBase58(); + }); + return token; + } catch (error: any) { + throw new Error(`Error fetching token data: ${error.message}`); + } +} + +export async function getTokenAddressFromTicker( + ticker: string +): Promise { + try { + const response = await fetch( + `https://api.dexscreener.com/latest/dex/search?q=${ticker}` + ); + const data = await response.json(); + + if (!data.pairs || data.pairs.length === 0) { + return null; + } + + // Filter for Solana pairs only and sort by FDV + let solanaPairs = data.pairs + .filter((pair: any) => pair.chainId === "solana") + .sort((a: any, b: any) => (b.fdv || 0) - (a.fdv || 0)); + + solanaPairs = solanaPairs.filter( + (pair: any) => + pair.baseToken.symbol.toLowerCase() === ticker.toLowerCase() + ); + + // Return the address of the highest FDV Solana pair + return solanaPairs[0].baseToken.address; + } catch (error) { + console.error("Error fetching token address from DexScreener:", error); + return null; + } +} + +export async function getTokenDataByTicker( + ticker: string +): Promise { + const address = await getTokenAddressFromTicker(ticker); + if (!address) { + throw new Error(`Token address not found for ticker: ${ticker}`); + } + return getTokenDataByAddress(new PublicKey(address)); +} \ No newline at end of file diff --git a/src/tools/index.ts b/src/tools/index.ts index 66d0fb6..b0b3028 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -6,9 +6,14 @@ export * from "./mint_nft"; export * from "./transfer"; export * from "./trade"; export * from "./register_domain"; +export * from "./resolve_sol_domain"; +export * from "./get_primary_domain"; export * from "./launch_pumpfun_token"; export * from "./lend"; export * from "./get_tps"; -export * from './stake_with_jup'; +export * from "./get_token_data"; +export * from "./stake_with_jup"; export * from "./fetch_price"; +export * from "./send_compressed_airdrop"; + export * from "./create_orca_single_sided_whirlpool"; \ No newline at end of file diff --git a/src/tools/mint_nft.ts b/src/tools/mint_nft.ts index bf3e68a..09bfe32 100644 --- a/src/tools/mint_nft.ts +++ b/src/tools/mint_nft.ts @@ -1,9 +1,9 @@ import { SolanaAgentKit } from "../index"; -import { generateSigner } from '@metaplex-foundation/umi'; -import { create } from '@metaplex-foundation/mpl-core'; +import { generateSigner, keypairIdentity } from '@metaplex-foundation/umi'; +import { create, mplCore } from '@metaplex-foundation/mpl-core'; import { fetchCollection } from '@metaplex-foundation/mpl-core'; import { PublicKey } from "@solana/web3.js"; -import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; +import { fromWeb3JsKeypair, fromWeb3JsPublicKey, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'; import { MintCollectionNFTResponse } from '../types'; @@ -20,7 +20,6 @@ export async function mintCollectionNFT( collectionMint: PublicKey, metadata: { name: string; - symbol: string; uri: string; sellerFeeBasisPoints?: number; creators?: Array<{ @@ -32,11 +31,12 @@ export async function mintCollectionNFT( ): Promise { try { // Create UMI instance from agent - const umi = createUmi(agent.connection) + const umi = createUmi(agent.connection.rpcEndpoint).use(mplCore()); + umi.use(keypairIdentity(fromWeb3JsKeypair(agent.wallet))); // Convert collection mint to UMI format const umiCollectionMint = fromWeb3JsPublicKey(collectionMint); - + // Fetch the existing collection const collection = await fetchCollection(umi, umiCollectionMint); @@ -48,8 +48,8 @@ export async function mintCollectionNFT( asset: assetSigner, collection: collection, name: metadata.name, - uri: metadata.uri, - owner: fromWeb3JsPublicKey(recipient!) + uri: metadata.uri, + owner: fromWeb3JsPublicKey(recipient ?? agent.wallet.publicKey) }).sendAndConfirm(umi); return { diff --git a/src/tools/resolve_sol_domain.ts b/src/tools/resolve_sol_domain.ts new file mode 100644 index 0000000..d8764cc --- /dev/null +++ b/src/tools/resolve_sol_domain.ts @@ -0,0 +1,30 @@ +import { resolve } from "@bonfida/spl-name-service"; +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../index"; + +/** + * Resolves a .sol domain to a Solana PublicKey. + * + * This function uses the Bonfida SPL Name Service to resolve a given .sol domain + * to the corresponding Solana PublicKey. The domain can be provided with or without + * the .sol suffix. + * + * @param agent SolanaAgentKit instance + * @param domain The .sol domain to resolve. This can be provided with or without the .sol TLD suffix + * @returns A promise that resolves to the corresponding Solana PublicKey + * @throws Error if the domain resolution fails + */ +export async function resolveSolDomain( + agent: SolanaAgentKit, + domain: string +): Promise { + if (!domain || typeof domain !== "string") { + throw new Error("Invalid domain. Expected a non-empty string."); + } + + try { + return await resolve(agent.connection, domain); + } catch (error) { + throw new Error(`Failed to resolve domain: ${domain}`); + } +} diff --git a/src/tools/send_compressed_airdrop.ts b/src/tools/send_compressed_airdrop.ts new file mode 100644 index 0000000..313bbdb --- /dev/null +++ b/src/tools/send_compressed_airdrop.ts @@ -0,0 +1,306 @@ +import { + AddressLookupTableAccount, + ComputeBudgetProgram, + Connection, + Keypair, + PublicKey, + TransactionInstruction, +} from "@solana/web3.js"; +import { SolanaAgentKit } from "../agent/index.js"; +import { + buildAndSignTx, + calculateComputeUnitPrice, + createRpc, + Rpc, + sendAndConfirmTx, + sleep, +} from "@lightprotocol/stateless.js"; +import { + CompressedTokenProgram, + createTokenPool, +} from "@lightprotocol/compressed-token"; +import { Account, getOrCreateAssociatedTokenAccount } from "@solana/spl-token"; + +// arbitrary +const MAX_AIRDROP_RECIPIENTS = 1000; +const MAX_CONCURRENT_TXS = 30; + +/** + * Estimate the cost of an airdrop in lamports. + * @param numberOfRecipients Number of recipients + * @param priorityFeeInLamports Priority fee in lamports + * @returns Estimated cost in lamports + */ +export const getAirdropCostEstimate = ( + numberOfRecipients: number, + priorityFeeInLamports: number +) => { + const baseFee = 5000; + const perRecipientCompressedStateFee = 300; + + const txsNeeded = Math.ceil(numberOfRecipients / 15); + const totalPriorityFees = txsNeeded * (baseFee + priorityFeeInLamports); + + return ( + perRecipientCompressedStateFee * numberOfRecipients + totalPriorityFees + ); +}; + +/** + * Send airdrop with ZK Compressed Tokens. + * @param agent Agent + * @param mintAddress SPL Mint address + * @param amount Amount to send per recipient + * @param decimals Decimals of the token + * @param recipients Recipient wallet addresses (no ATAs) + * @param priorityFeeInLamports Priority fee in lamports + * @param shouldLog Whether to log progress to stdout. Defaults to false. + */ +export async function sendCompressedAirdrop( + agent: SolanaAgentKit, + mintAddress: PublicKey, + amount: number, + decimals: number, + recipients: PublicKey[], + priorityFeeInLamports: number, + shouldLog: boolean = false +): Promise { + if (recipients.length > MAX_AIRDROP_RECIPIENTS) { + throw new Error( + `Max airdrop can be ${MAX_AIRDROP_RECIPIENTS} recipients at a time. For more scale, use open source ZK Compression airdrop tools such as https://github.com/helius-labs/airship.` + ); + } + + + const url = agent.connection.rpcEndpoint; + if (url.includes("devnet")) { + throw new Error("Devnet is not supported for airdrop. Please use mainnet."); + } + if (!url.includes("helius")) { + console.warn( + "Warning: Must use RPC with ZK Compression support. Double check with your RPC provider if in doubt." + ); + } + + let sourceTokenAccount: Account; + try { + sourceTokenAccount = await getOrCreateAssociatedTokenAccount( + agent.connection, + agent.wallet, + mintAddress, + agent.wallet.publicKey + ); + } catch (error) { + throw new Error( + "Source token account not found and failed to create it. Please add funds to your wallet and try again." + ); + } + + try { + await createTokenPool( + agent.connection as unknown as Rpc, + agent.wallet, + mintAddress + ); + } catch (error: any) { + if (error.message.includes("already in use")) { + // skip + } else { + throw error; + } + } + + return await processAll( + agent, + amount * 10 ** decimals, + mintAddress, + recipients, + priorityFeeInLamports, + shouldLog + ); +} + +async function processAll( + agent: SolanaAgentKit, + amount: number, + mint: PublicKey, + recipients: PublicKey[], + priorityFeeInLamports: number, + shouldLog: boolean +): Promise { + const mintAddress = mint; + const payer = agent.wallet; + + const sourceTokenAccount = await getOrCreateAssociatedTokenAccount( + agent.connection, + agent.wallet, + mintAddress, + agent.wallet.publicKey + ); + + const maxRecipientsPerInstruction = 5; + const maxIxs = 3; // empirically determined (as of 12/15/2024) + const lookupTableAddress = new PublicKey( + "9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ" + ); + + const lookupTableAccount = ( + await agent.connection.getAddressLookupTable(lookupTableAddress) + ).value!; + + const batches: PublicKey[][] = []; + for ( + let i = 0; + i < recipients.length; + i += maxRecipientsPerInstruction * maxIxs + ) { + batches.push(recipients.slice(i, i + maxRecipientsPerInstruction * maxIxs)); + } + + const instructionSets = await Promise.all( + batches.map(async (recipientBatch) => { + const instructions: TransactionInstruction[] = [ + ComputeBudgetProgram.setComputeUnitLimit({ units: 500_000 }), + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: calculateComputeUnitPrice( + priorityFeeInLamports, + 500_000 + ), + }), + ]; + + const compressIxPromises = []; + for ( + let i = 0; + i < recipientBatch.length; + i += maxRecipientsPerInstruction + ) { + const batch = recipientBatch.slice(i, i + maxRecipientsPerInstruction); + compressIxPromises.push( + CompressedTokenProgram.compress({ + payer: payer.publicKey, + owner: payer.publicKey, + source: sourceTokenAccount.address, + toAddress: batch, + amount: batch.map(() => amount), + mint: mintAddress, + }) + ); + } + + const compressIxs = await Promise.all(compressIxPromises); + return [...instructions, ...compressIxs]; + }) + ); + + const url = agent.connection.rpcEndpoint; + const rpc = createRpc(url, url, url); + + const results = []; + let confirmedCount = 0; + const totalBatches = instructionSets.length; + + const renderProgressBar = (current: number, total: number) => { + const percentage = Math.floor((current / total) * 100); + const filled = Math.floor((percentage / 100) * 20); + const empty = 20 - filled; + const bar = "█".repeat(filled) + "░".repeat(empty); + return `Airdropped to ${Math.min(current * 15, recipients.length)}/${ + recipients.length + } recipients [${bar}] ${percentage}%`; + }; + + const log = (message: string) => { + if (shouldLog && typeof process !== "undefined" && process.stdout) { + process.stdout.write(message); + } + }; + + for (let i = 0; i < instructionSets.length; i += MAX_CONCURRENT_TXS) { + const batchPromises = instructionSets + .slice(i, i + MAX_CONCURRENT_TXS) + .map((instructions, idx) => + sendTransactionWithRetry( + rpc, + instructions, + payer, + lookupTableAccount, + i + idx + ).then((signature) => { + confirmedCount++; + log("\r" + renderProgressBar(confirmedCount, totalBatches)); + return signature; + }) + ); + + const batchResults = await Promise.allSettled(batchPromises); + results.push(...batchResults); + } + + log("\n"); + + const failures = results + .filter((r) => r.status === "rejected") + .map((r, idx) => ({ + index: idx, + error: (r as PromiseRejectedResult).reason, + })); + + if (failures.length > 0) { + throw new Error( + `Failed to process ${failures.length} batches: ${failures + .map((f) => f.error) + .join(", ")}` + ); + } + + return results.map((r) => (r as PromiseFulfilledResult).value); +} + +async function sendTransactionWithRetry( + connection: Rpc, + instructions: TransactionInstruction[], + payer: Keypair, + lookupTableAccount: AddressLookupTableAccount, + batchIndex: number +): Promise { + const MAX_RETRIES = 3; + const INITIAL_BACKOFF = 500; // ms + + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + const { blockhash } = await connection.getLatestBlockhash(); + const tx = buildAndSignTx( + instructions, + payer, + blockhash, + [], + [lookupTableAccount] + ); + + const signature = await sendAndConfirmTx(connection, tx); + + return signature; + } catch (error: any) { + const isRetryable = + error.message?.includes("blockhash not found") || + error.message?.includes("timeout") || + error.message?.includes("rate limit") || + error.message?.includes("too many requests"); + + if (!isRetryable || attempt === MAX_RETRIES - 1) { + throw new Error( + `Batch ${batchIndex} failed after ${attempt + 1} attempts: ${ + error.message + }` + ); + } + + const backoff = + INITIAL_BACKOFF * Math.pow(2, attempt) * (0.5 + Math.random()); + await sleep(backoff); + } + } + + throw new Error("Unreachable"); +} diff --git a/src/types/index.ts b/src/types/index.ts index d6d4264..28d64cb 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -39,7 +39,6 @@ export interface PumpfunLaunchResponse { error?: string; } - /** * Lulo Account Details response format */ @@ -55,6 +54,22 @@ export interface LuloAccountDetailsResponse { }; } +export interface JupiterTokenData { + address: string; + name: string; + symbol: string; + decimals: number; + tags: string[]; + logoURI: string; + daily_volume: number; + freeze_authority: string | null; + mint_authority: string | null; + permanent_delegate: string | null; + extensions: { + coingeckoId?: string; + }; +} + export interface FetchPriceResponse { status: "success" | "error"; tokenId?: string; diff --git a/src/utils/send_tx.ts b/src/utils/send_tx.ts index 593cbc8..903ddd5 100644 --- a/src/utils/send_tx.ts +++ b/src/utils/send_tx.ts @@ -41,7 +41,7 @@ export async function getPriorityFees(connection: Connection): Promise<{ const median = sortedFees.length % 2 === 0 ? ((sortedFees[mid - 1] ?? 0) + (sortedFees[mid] ?? 0)) / 2 - : (sortedFees[mid] ?? 0); + : sortedFees[mid] ?? 0; // Helper to create priority fee IX based on chosen strategy const createPriorityFeeIx = (fee: number) => { @@ -76,7 +76,7 @@ export async function getPriorityFees(connection: Connection): Promise<{ export async function sendTx( agent: SolanaAgentKit, tx: Transaction, - otherKeypairs?: Keypair[], + otherKeypairs?: Keypair[] ) { tx.recentBlockhash = (await agent.connection.getLatestBlockhash()).blockhash; tx.feePayer = agent.wallet_address; @@ -90,8 +90,9 @@ export async function sendTx( await agent.connection.confirmTransaction({ signature: txid, blockhash: (await agent.connection.getLatestBlockhash()).blockhash, - lastValidBlockHeight: (await agent.connection.getLatestBlockhash()) - .lastValidBlockHeight, + lastValidBlockHeight: ( + await agent.connection.getLatestBlockhash() + ).lastValidBlockHeight, }); return txid; } diff --git a/test/index.ts b/test/index.ts index c1d76de..9522c23 100644 --- a/test/index.ts +++ b/test/index.ts @@ -12,8 +12,8 @@ dotenv.config(); function validateEnvironment(): void { const missingVars: string[] = []; - const requiredVars = ["OPENAI_API_KEY", "HELIUS_API_KEY", "SOLANA_PRIVATE_KEY"]; - + const requiredVars = ["OPENAI_API_KEY", "RPC_URL", "SOLANA_PRIVATE_KEY"]; + requiredVars.forEach(varName => { if (!process.env[varName]) { missingVars.push(varName); @@ -52,7 +52,7 @@ async function initializeAgent() { const solanaKit = new SolanaAgentKit( process.env.SOLANA_PRIVATE_KEY!, - `https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`, + process.env.RPC_URL, process.env.OPENAI_API_KEY! ); @@ -176,7 +176,7 @@ async function chooseMode(): Promise<"chat" | "auto"> { .trim(); rl.close(); - + if (choice === "1" || choice === "chat") { return "chat"; } else if (choice === "2" || choice === "auto") {