diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 4268dc8..94a19ed 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJyNlcFu2zAMQP9F52Bps7XdcsuSZU3XNUFr7DLswMp0LFiWDIneEgz79yFOUNuxTOfig/n4KEuU+fOvINyRmIoXq8HAbIuGvikSI1EApWIqpAbv0Y/b8Xcp5VqMRKZMLKbXk4//Rm+mmSRlTW1QhtAlINGPj6F28uTmtpP8ZQd5oZFxnAhO9RlIpmsXo9sAEbrwkjoUp5xbrbGqv8BC232OhoLWEHiZeF0cnn7AeqJ4pUnUtsdzCLHJDoGsC2cfY1z6EkmmG6ckPqMvrPHho+xinPSrev1jXVaVxwh89oz96j6YK/BQForQRTZDswCCoPgc4oSPpbYzKW1paIEESnt2O/pxrsh3ZahujKdlxNbopbkSp+vhIA/3ZSPOaTZlXiSleYTSyJRdZZAcUi9LU50Kd4MCHKvdU3phL4fRIXkFLxHj1WJFmPeaz7iLtMPCIVW1TfMUZRb01GFOcg8m1tj4ldC+QD8+vT7LvPp0d30zac6DebRaP73U2b/BKXjVh0FwDLUN75vJsrr9x8kVWasbPZGUproBftyB2sLbDx3hD3QS9Ww1oGxhjBR3KEvC87FZ61oAI0qUifstdZRRbJFa8zX4eR2oI/z1H/fI5D8=" \ No newline at end of file +window.navigationData = "eJyNllGTkzAQgP9LnjvWq96pfaut1ep57dwxvjg+7IWlZAgJkyzajuN/d0o7B5Sw8MID++23sMkSfv4VhAcSc/FkNRhY7NHQN0ViIgqgVMyF1OA9+mk7/iqlXIuJyJSJxfxm9v7f5MW0kKSsqQ3KELoEJPrpOdROnt3edZI/HSAvNDKOC8GpPgLJdOtidDsgQhd+pA7FKZdWa6zqr7DQ9pijoaA1BI4Tb4vT1Q9YLxSvNIna93hOITbZIZB14exzjEtfI8l055TER/SFNT68lF2MlWrw6VJbj5GDGHfgIA/3KUgOqkdZRwo/q+c/1mVVqzACnz1ifxv6YK7A17JQhC6yGZoVEATF1xAnvC+1XUhpS0MrJFDas0vXj3NFvitD9SZ+WEdsjV6aK3EZ5d5VbMQ5za7Mi6Q091AambJPGSSH1OvSVKvCTXuAY7VHSkfOXRgdklfwGjHerDaEea/5ihulHRYOqao2LVOUWdBThznJFzCxxsZnj44F+unl9lXm6w/vbm5nzbNrGW22D0919m9wCp716dA6h9qGN81kWU3/+ZSNrNWNPZGUppoAP+1AbeHd247wBzqJerEZULYwRooHlCXh9RFf61oAI0qUifstdZRR7JFa/wLB1+tAHeGv/7OFIBQ=" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 86069d6..919304b 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/classes/SolanaAgentKit.html b/docs/classes/SolanaAgentKit.html index f0aebb1..5e9f212 100644 --- a/docs/classes/SolanaAgentKit.html +++ b/docs/classes/SolanaAgentKit.html @@ -1,7 +1,7 @@ SolanaAgentKit | solana-agent-kit

Class SolanaAgentKit

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

SolanaAgentKit

-

Constructors

Constructors

Properties

config connection wallet @@ -17,6 +17,8 @@ Provides a unified interface for token operations, NFT management, trading and m fetchTokenDetailedReport fetchTokenPrice fetchTokenReportSummary +flashCloseTrade +flashOpenTrade getAllDomainsTLDs getAllRegisteredAllDomains getBalance @@ -65,8 +67,14 @@ Please use the new constructor with Config object instead:

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

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

    Returns SolanaAgentKit

  • Properties

    config: Config

    Configuration object

    -
    connection: Connection

    Solana RPC connection

    -
    wallet: Keypair

    Wallet keypair for signing transactions

    -
    wallet_address: PublicKey

    Public key of the wallet

    -

    Methods

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<GibworkCreateTaskReponse>

    • Parameters

      • amount: number
      • OptionalsplmintAddress: PublicKey

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

    • Parameters

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

      Returns Promise<{ mint: PublicKey }>

    • Parameters

      • mint: string

      Returns Promise<string>

    • Returns Promise<string[]>

    • Returns Promise<string[]>

    • Parameters

      • Optionaltoken_address: PublicKey

      Returns Promise<number>

    • Parameters

      • walletAddress: PublicKey
      • OptionaltokenAddress: PublicKey

      Returns Promise<number>

    • Parameters

      • owner: PublicKey

      Returns Promise<null | string>

    • Parameters

      • owner: PublicKey

      Returns Promise<string[]>

    • Parameters

      • tld: string

      Returns Promise<string[]>

    • Parameters

      • account: PublicKey

      Returns Promise<string>

    • Parameters

      • priceFeedID: string

      Returns Promise<string>

    • Parameters

      • tokenSymbol: string

      Returns Promise<string>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<MintCollectionNFTResponse>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • positionMintAddress: PublicKey

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • name: string
      • OptionalspaceKB: number

      Returns Promise<string>

    • Parameters

      • domain: string

      Returns Promise<undefined | PublicKey>

    • Parameters

      • domain: string

      Returns Promise<PublicKey>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey
      • price: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

    +
  • Parameters

    Returns SolanaAgentKit

  • Properties

    config: Config

    Configuration object

    +
    connection: Connection

    Solana RPC connection

    +
    wallet: Keypair

    Wallet keypair for signing transactions

    +
    wallet_address: PublicKey

    Public key of the wallet

    +

    Methods

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<GibworkCreateTaskReponse>

    • Parameters

      • amount: number
      • OptionalsplmintAddress: PublicKey

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

    • Parameters

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

      Returns Promise<{ mint: PublicKey }>

    • Parameters

      • mint: string

      Returns Promise<string>

    • Opens a new trading position on Flash.Trade

      +

      Parameters

      • params: FlashTradeParams

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

        +

      Returns Promise<string>

      Transaction signature

      +
    • Returns Promise<string[]>

    • Returns Promise<string[]>

    • Parameters

      • Optionaltoken_address: PublicKey

      Returns Promise<number>

    • Parameters

      • walletAddress: PublicKey
      • OptionaltokenAddress: PublicKey

      Returns Promise<number>

    • Parameters

      • owner: PublicKey

      Returns Promise<null | string>

    • Parameters

      • owner: PublicKey

      Returns Promise<string[]>

    • Parameters

      • tld: string

      Returns Promise<string[]>

    • Parameters

      • account: PublicKey

      Returns Promise<string>

    • Parameters

      • priceFeedID: string

      Returns Promise<string>

    • Parameters

      • tokenSymbol: string

      Returns Promise<string>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<MintCollectionNFTResponse>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • positionMintAddress: PublicKey

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • name: string
      • OptionalspaceKB: number

      Returns Promise<string>

    • Parameters

      • domain: string

      Returns Promise<undefined | PublicKey>

    • Parameters

      • domain: string

      Returns Promise<PublicKey>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey

      Returns Promise<string>

    • Parameters

      • nftMint: PublicKey
      • price: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

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

    Function createSolanaTools

    • Parameters

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

    +createSolanaTools | solana-agent-kit

    Function createSolanaTools

    • Parameters

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

    diff --git a/docs/functions/createVercelAITools.html b/docs/functions/createVercelAITools.html index 17d1f55..4876fc2 100644 --- a/docs/functions/createVercelAITools.html +++ b/docs/functions/createVercelAITools.html @@ -1 +1 @@ -createVercelAITools | solana-agent-kit

    Function createVercelAITools

    +createVercelAITools | solana-agent-kit

    Function createVercelAITools

    diff --git a/docs/functions/executeAction.html b/docs/functions/executeAction.html index 06d59ce..8cbf713 100644 --- a/docs/functions/executeAction.html +++ b/docs/functions/executeAction.html @@ -1,2 +1,2 @@ executeAction | solana-agent-kit

    Function executeAction

    • Execute an action with the given input

      -

      Parameters

      Returns Promise<Record<string, any>>

    +

    Parameters

    Returns Promise<Record<string, any>>

    diff --git a/docs/functions/findAction.html b/docs/functions/findAction.html index d525326..df2485a 100644 --- a/docs/functions/findAction.html +++ b/docs/functions/findAction.html @@ -1,2 +1,2 @@ findAction | solana-agent-kit

    Function findAction

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

      -

      Parameters

      • query: string

      Returns Action | undefined

    +

    Parameters

    Returns Action | undefined

    diff --git a/docs/functions/getActionExamples.html b/docs/functions/getActionExamples.html index 57fa5b3..0b15a4a 100644 --- a/docs/functions/getActionExamples.html +++ b/docs/functions/getActionExamples.html @@ -1,2 +1,2 @@ getActionExamples | solana-agent-kit

    Function getActionExamples

    • Get examples for an action

      -

      Parameters

      • action: Action

      Returns string

    +

    Parameters

    Returns string

    diff --git a/docs/interfaces/Action.html b/docs/interfaces/Action.html index 23e24a4..54d476c 100644 --- a/docs/interfaces/Action.html +++ b/docs/interfaces/Action.html @@ -1,16 +1,16 @@ Action | solana-agent-kit

    Interface Action

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

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

    Properties

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

    Properties

    description: string

    Detailed description of what the action does

    -
    examples: ActionExample[][]

    Array of example inputs and outputs for the action +

    examples: ActionExample[][]

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

    -
    handler: Handler

    Function that executes the action

    -
    name: string

    Unique name of the action

    -
    schema: ZodType

    Zod schema for input validation

    -
    similes: string[]

    Alternative names/phrases that can trigger this action

    -
    +
    handler: Handler

    Function that executes the action

    +
    name: string

    Unique name of the action

    +
    schema: ZodType

    Zod schema for input validation

    +
    similes: string[]

    Alternative names/phrases that can trigger this action

    +
    diff --git a/docs/interfaces/ActionExample.html b/docs/interfaces/ActionExample.html index 2377d21..6f64693 100644 --- a/docs/interfaces/ActionExample.html +++ b/docs/interfaces/ActionExample.html @@ -1,5 +1,5 @@ ActionExample | solana-agent-kit

    Interface ActionExample

    Example of an action with input and output

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

    Properties

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

    Properties

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

    Properties

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

    Interface BatchOrderPattern

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

    Properties

    individualQuantity? +BatchOrderPattern | solana-agent-kit

    Interface BatchOrderPattern

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

    Properties

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

    Properties

    individualQuantity?: number
    numberOfOrders?: number
    priceRange?: { max?: number; min?: number }
    side: string
    spacing?: { type: "percentage" | "fixed"; value: number }
    totalQuantity?: number
    diff --git a/docs/interfaces/CollectionDeployment.html b/docs/interfaces/CollectionDeployment.html index c35a066..eeba065 100644 --- a/docs/interfaces/CollectionDeployment.html +++ b/docs/interfaces/CollectionDeployment.html @@ -1,3 +1,3 @@ -CollectionDeployment | solana-agent-kit

    Interface CollectionDeployment

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

    Properties

    collectionAddress +CollectionDeployment | solana-agent-kit

    Interface CollectionDeployment

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

    Properties

    collectionAddress: PublicKey
    signature: Uint8Array
    +

    Properties

    collectionAddress: PublicKey
    signature: Uint8Array
    diff --git a/docs/interfaces/CollectionOptions.html b/docs/interfaces/CollectionOptions.html index 1861667..a78d3bf 100644 --- a/docs/interfaces/CollectionOptions.html +++ b/docs/interfaces/CollectionOptions.html @@ -1,5 +1,5 @@ -CollectionOptions | solana-agent-kit

    Interface CollectionOptions

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

    Properties

    creators? +CollectionOptions | solana-agent-kit

    Interface CollectionOptions

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

    Properties

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

    Properties

    creators?: Creator[]
    name: string
    royaltyBasisPoints?: number
    uri: string
    diff --git a/docs/interfaces/Config.html b/docs/interfaces/Config.html index de80422..71ffa6e 100644 --- a/docs/interfaces/Config.html +++ b/docs/interfaces/Config.html @@ -1,4 +1,4 @@ -Config | solana-agent-kit

    Interface Config

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

    Properties

    JUPITER_FEE_BPS? +Config | solana-agent-kit

    Interface Config

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

    Properties

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

    Properties

    JUPITER_FEE_BPS?: number
    JUPITER_REFERRAL_ACCOUNT?: string
    OPENAI_API_KEY?: string
    diff --git a/docs/interfaces/Creator.html b/docs/interfaces/Creator.html index d4e44be..87f7280 100644 --- a/docs/interfaces/Creator.html +++ b/docs/interfaces/Creator.html @@ -1,3 +1,3 @@ -Creator | solana-agent-kit

    Interface Creator

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

    Properties

    address +Creator | solana-agent-kit

    Interface Creator

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

    Properties

    Properties

    address: string
    percentage: number
    +

    Properties

    address: string
    percentage: number
    diff --git a/docs/interfaces/FetchPriceResponse.html b/docs/interfaces/FetchPriceResponse.html index 33ede0e..7e7f77c 100644 --- a/docs/interfaces/FetchPriceResponse.html +++ b/docs/interfaces/FetchPriceResponse.html @@ -1,6 +1,6 @@ -FetchPriceResponse | solana-agent-kit

    Interface FetchPriceResponse

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

    Properties

    code? +FetchPriceResponse | solana-agent-kit

    Interface FetchPriceResponse

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

    Properties

    code?: string
    message?: string
    priceInUSDC?: string
    status: "success" | "error"
    tokenId?: string
    +

    Properties

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

    Interface FlashCloseTradeParams

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

    Properties

    Properties

    side: "long" | "short"
    token: string
    diff --git a/docs/interfaces/FlashTradeParams.html b/docs/interfaces/FlashTradeParams.html new file mode 100644 index 0000000..19a44df --- /dev/null +++ b/docs/interfaces/FlashTradeParams.html @@ -0,0 +1,5 @@ +FlashTradeParams | solana-agent-kit

    Interface FlashTradeParams

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

    Properties

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

    Interface GibworkCreateTaskReponse

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

    Properties

    signature? +GibworkCreateTaskReponse | solana-agent-kit

    Interface GibworkCreateTaskReponse

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

    Properties

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

    Properties

    signature?: string
    status: "success" | "error"
    taskId?: string
    diff --git a/docs/interfaces/JupiterTokenData.html b/docs/interfaces/JupiterTokenData.html index 2d333d5..2ad8b8a 100644 --- a/docs/interfaces/JupiterTokenData.html +++ b/docs/interfaces/JupiterTokenData.html @@ -1,4 +1,4 @@ -JupiterTokenData | solana-agent-kit

    Interface JupiterTokenData

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

    Properties

    address +JupiterTokenData | solana-agent-kit

    Interface JupiterTokenData

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

    Properties

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

    Properties

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

    Interface MintCollectionNFTResponse

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

    Properties

    metadata +MintCollectionNFTResponse | solana-agent-kit

    Interface MintCollectionNFTResponse

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

    Properties

    Properties

    metadata: PublicKey
    mint: PublicKey
    +

    Properties

    metadata: PublicKey
    mint: PublicKey
    diff --git a/docs/interfaces/OrderParams.html b/docs/interfaces/OrderParams.html index 6a6d2bb..93bb466 100644 --- a/docs/interfaces/OrderParams.html +++ b/docs/interfaces/OrderParams.html @@ -1,4 +1,4 @@ -OrderParams | solana-agent-kit

    Interface OrderParams

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

    Properties

    price +OrderParams | solana-agent-kit

    Interface OrderParams

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

    Properties

    Properties

    price: number
    quantity: number
    side: string
    +

    Properties

    price: number
    quantity: number
    side: string
    diff --git a/docs/interfaces/PumpFunTokenOptions.html b/docs/interfaces/PumpFunTokenOptions.html index 3cd7f3b..6fb34c9 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 c9caddc..fb86e22 100644 --- a/docs/interfaces/PumpfunLaunchResponse.html +++ b/docs/interfaces/PumpfunLaunchResponse.html @@ -1,5 +1,5 @@ -PumpfunLaunchResponse | solana-agent-kit

    Interface PumpfunLaunchResponse

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

    Properties

    error? +PumpfunLaunchResponse | solana-agent-kit

    Interface PumpfunLaunchResponse

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

    Properties

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

    Properties

    error?: string
    metadataUri?: string
    mint: string
    signature: string
    diff --git a/docs/interfaces/PythFetchPriceResponse.html b/docs/interfaces/PythFetchPriceResponse.html index b22faef..9cb1b2d 100644 --- a/docs/interfaces/PythFetchPriceResponse.html +++ b/docs/interfaces/PythFetchPriceResponse.html @@ -1,7 +1,7 @@ -PythFetchPriceResponse | solana-agent-kit

    Interface PythFetchPriceResponse

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

    Properties

    code? +PythFetchPriceResponse | solana-agent-kit

    Interface PythFetchPriceResponse

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

    Properties

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

    Properties

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

    Interface PythPriceFeedIDItem

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

    Properties

    attributes +PythPriceFeedIDItem | solana-agent-kit

    Interface PythPriceFeedIDItem

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

    Properties

    Properties

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

    Properties

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

    Interface PythPriceItem

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

    Properties

    binary +PythPriceItem | solana-agent-kit

    Interface PythPriceItem

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

    Properties

    Properties

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

    Properties

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

    Interface TokenCheck

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

    Properties

    risks +TokenCheck | solana-agent-kit

    Interface TokenCheck

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

    Properties

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

    Properties

    risks: { description: string; level: string; name: string; score: number }[]
    score: number
    tokenProgram: string
    tokenType: string
    diff --git a/docs/modules.html b/docs/modules.html index b8e5d93..0a03fbb 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1 +1 @@ -solana-agent-kit

    solana-agent-kit

    Classes

    SolanaAgentKit

    Interfaces

    Action
    ActionExample
    BatchOrderPattern
    CollectionDeployment
    CollectionOptions
    Config
    Creator
    FetchPriceResponse
    GibworkCreateTaskReponse
    JupiterTokenData
    LuloAccountDetailsResponse
    MintCollectionNFTResponse
    OrderParams
    PumpfunLaunchResponse
    PumpFunTokenOptions
    PythFetchPriceResponse
    PythPriceFeedIDItem
    PythPriceItem
    TokenCheck

    Type Aliases

    Handler

    Variables

    ACTIONS

    Functions

    createSolanaTools
    createVercelAITools
    executeAction
    findAction
    getActionExamples
    +solana-agent-kit

    solana-agent-kit

    Classes

    SolanaAgentKit

    Interfaces

    Action
    ActionExample
    BatchOrderPattern
    CollectionDeployment
    CollectionOptions
    Config
    Creator
    FetchPriceResponse
    FlashCloseTradeParams
    FlashTradeParams
    GibworkCreateTaskReponse
    JupiterTokenData
    LuloAccountDetailsResponse
    MintCollectionNFTResponse
    OrderParams
    PumpfunLaunchResponse
    PumpFunTokenOptions
    PythFetchPriceResponse
    PythPriceFeedIDItem
    PythPriceItem
    TokenCheck

    Type Aliases

    Handler

    Variables

    ACTIONS

    Functions

    createSolanaTools
    createVercelAITools
    executeAction
    findAction
    getActionExamples
    diff --git a/docs/types/Handler.html b/docs/types/Handler.html index fca3028..6e39ac5 100644 --- a/docs/types/Handler.html +++ b/docs/types/Handler.html @@ -1,2 +1,2 @@ Handler | solana-agent-kit

    Type Alias Handler

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

    Handler function type for executing the action

    -

    Type declaration

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

        Returns Promise<Record<string, any>>

    +

    Type declaration

    diff --git a/docs/variables/actions.html b/docs/variables/actions.html index 67af484..ec6bd8b 100644 --- a/docs/variables/actions.html +++ b/docs/variables/actions.html @@ -1 +1 @@ -ACTIONS | solana-agent-kit

    Variable ACTIONSConst

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

    Type declaration

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

    Variable ACTIONSConst

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

    Type declaration

    • BALANCE_ACTION: Action
    • CREATE_GIBWORK_TASK_ACTION: Action
    • CREATE_IMAGE_ACTION: Action
    • CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: Action
    • DEPLOY_COLLECTION_ACTION: Action
    • DEPLOY_TOKEN_ACTION: Action
    • FETCH_PRICE_ACTION: Action
    • FLASH_CLOSE_TRADE_ACTION: Action
    • FLASH_OPEN_TRADE_ACTION: Action
    • GET_ALL_DOMAINS_TLDS_ACTION: Action
    • GET_ALL_REGISTERED_ALL_DOMAINS_ACTION: Action
    • GET_MAIN_ALL_DOMAINS_DOMAIN_ACTION: Action
    • GET_OWNED_ALL_DOMAINS_ACTION: Action
    • GET_OWNED_DOMAINS_FOR_TLD_ACTION: Action
    • GET_PRIMARY_DOMAIN_ACTION: Action
    • GET_TOKEN_DATA_ACTION: Action
    • GET_TPS_ACTION: Action
    • LAUNCH_PUMPFUN_TOKEN_ACTION: Action
    • LEND_ASSET_ACTION: Action
    • MINT_NFT_ACTION: Action
    • PYTH_FETCH_PRICE_ACTION: Action
    • RAYDIUM_CREATE_AMM_V4_ACTION: Action
    • RAYDIUM_CREATE_CPMM_ACTION: Action
    • REGISTER_DOMAIN_ACTION: Action
    • REQUEST_FUNDS_ACTION: Action
    • RESOLVE_DOMAIN_ACTION: Action
    • RESOLVE_SOL_DOMAIN_ACTION: Action
    • STAKE_WITH_JUP_ACTION: Action
    • STAKE_WITH_SOLAYER_ACTION: Action
    • TRADE_ACTION: Action
    • TRANSFER_ACTION: Action
    • WALLET_ADDRESS_ACTION: Action
    diff --git a/package.json b/package.json index 47dfb22..0f396d2 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@onsol/tldparser": "^0.6.7", "@orca-so/common-sdk": "0.6.4", "@orca-so/whirlpools-sdk": "^0.13.12", + "@pythnetwork/hermes-client": "^1.3.0", "@raydium-io/raydium-sdk-v2": "0.1.95-alpha", "@solana/spl-token": "^0.4.9", "@solana/web3.js": "^1.98.0", @@ -53,6 +54,7 @@ "chai": "^5.1.2", "decimal.js": "^10.4.3", "dotenv": "^16.4.7", + "flash-sdk": "^2.24.3", "form-data": "^4.0.1", "langchain": "^0.3.8", "openai": "^4.77.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73a9adf..157d2bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: '@orca-so/whirlpools-sdk': specifier: ^0.13.12 version: 0.13.13(@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(decimal.js@10.4.3))(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(decimal.js@10.4.3) + '@pythnetwork/hermes-client': + specifier: ^1.3.0 + version: 1.3.0(axios@1.7.9) '@raydium-io/raydium-sdk-v2': specifier: 0.1.95-alpha version: 0.1.95-alpha(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) @@ -98,6 +101,9 @@ importers: dotenv: specifier: ^16.4.7 version: 16.4.7 + flash-sdk: + specifier: ^2.24.3 + version: 2.24.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) form-data: specifier: ^4.0.1 version: 4.0.1 @@ -220,6 +226,10 @@ packages: resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==} engines: {node: '>=11'} + '@coral-xyz/anchor@0.27.0': + resolution: {integrity: sha512-+P/vPdORawvg3A9Wj02iquxb4T0C5m4P6aZBVYysKl4Amk+r6aMPZkUhilBkD6E4Nuxnoajv3CFykUfkGE0n5g==} + engines: {node: '>=11'} + '@coral-xyz/anchor@0.29.0': resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} engines: {node: '>=11'} @@ -230,6 +240,18 @@ packages: peerDependencies: '@solana/web3.js': ^1.68.0 + '@coral-xyz/borsh@0.27.0': + resolution: {integrity: sha512-tJKzhLukghTWPLy+n8K8iJKgBq1yLT/AxaNd10yJrX8mI56ao5+OFAKAqW/h0i79KCvb4BK0VGO5ECmmolFz9A==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + + '@coral-xyz/borsh@0.28.0': + resolution: {integrity: sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + '@coral-xyz/borsh@0.29.0': resolution: {integrity: sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==} engines: {node: '>=10'} @@ -599,6 +621,21 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pythnetwork/client@2.22.0': + resolution: {integrity: sha512-Cyv23YqewKUL1pcm99jfmdetUa2aaUXjyRF9jvSeFcY895FddRu7uSWftYiaevsnx7vn4WbJgQR6ExxH+aONow==} + peerDependencies: + '@solana/web3.js': ^1.30.2 + + '@pythnetwork/hermes-client@1.3.0': + resolution: {integrity: sha512-SneB+LJSD6pNnG2JUuAgbHNi1qFDcnrIiMuU60FQxZMtIWP09YFMR64vxWxVawyqR93t0iQHcV5HT/hhfmqYOQ==} + + '@pythnetwork/price-service-client@1.9.0': + resolution: {integrity: sha512-SLm3IFcfmy9iMqHeT4Ih6qMNZhJEefY14T9yTlpsH2D/FE5+BaGGnfcexUifVlfH6M7mwRC4hEFdNvZ6ebZjJg==} + deprecated: This package is deprecated and is no longer maintained. Please use @pythnetwork/hermes-client instead. + + '@pythnetwork/price-service-sdk@1.8.0': + resolution: {integrity: sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==} + '@raydium-io/raydium-sdk-v2@0.1.95-alpha': resolution: {integrity: sha512-+u7yxo/R1JDysTCzOuAlh90ioBe2DlM2Hbcz/tFsxP/YzmnYQzShvNjcmc0361a4zJhmlrEJfpFXW0J3kkX5vA==} @@ -815,6 +852,9 @@ packages: '@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==} + '@solana/web3.js@1.98.0': resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} @@ -893,6 +933,9 @@ packages: '@types/node@18.19.69': resolution: {integrity: sha512-ECPdY1nlaiO/Y6GUnwgtAAhLNaQ53AyIVz+eILxpEo5OvuqE6yWkqWBIb5dU0DqhKQtMeny+FBD3PK6lm7L5xQ==} + '@types/node@20.17.11': + resolution: {integrity: sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==} + '@types/node@22.10.5': resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} @@ -982,6 +1025,12 @@ packages: '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@zodios/core@10.9.6': + resolution: {integrity: sha512-aH4rOdb3AcezN7ws8vDgBfGboZMk2JGGzEq/DtW65MhnRxyTGRuLJRWVQ/2KxDgWvV2F5oTkAS+5pnjKbl0n+A==} + peerDependencies: + axios: ^0.x || ^1.0.0 + zod: ^3.x + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -1077,6 +1126,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios-retry@3.9.1: + resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} + axios@0.28.1: resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==} @@ -1293,6 +1345,10 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -1553,6 +1609,10 @@ packages: resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} engines: {node: '>=18.0.0'} + eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -1599,6 +1659,10 @@ packages: fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1626,6 +1690,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flash-sdk@2.24.3: + resolution: {integrity: sha512-3JdmHZksBgcRlCXVVFZEV64NGKxVHURHoHAMc3+Ev1BdN0Re2S44wxTaQmO6EIvwPYscVG0BPbp6GibpEuMdsw==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1664,6 +1731,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -1675,6 +1746,9 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs@0.0.1-security: + resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1872,6 +1946,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1922,6 +2000,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbi@4.3.0: + resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2238,6 +2319,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -2731,6 +2816,9 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-log@2.2.7: + resolution: {integrity: sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -2806,6 +2894,9 @@ 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==} @@ -3116,6 +3207,28 @@ snapshots: - encoding - utf-8-validate + '@coral-xyz/anchor@0.27.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/borsh': 0.27.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + base64-js: 1.5.1 + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + js-sha256: 0.9.0 + pako: 2.1.0 + snake-case: 3.0.4 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@coral-xyz/anchor@0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -3143,6 +3256,18 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 + '@coral-xyz/borsh@0.27.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + + '@coral-xyz/borsh@0.28.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -3697,6 +3822,43 @@ snapshots: '@pkgr/core@0.1.1': {} + '@pythnetwork/client@2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@pythnetwork/hermes-client@1.3.0(axios@1.7.9)': + dependencies: + '@zodios/core': 10.9.6(axios@1.7.9)(zod@3.24.1) + eventsource: 2.0.2 + zod: 3.24.1 + transitivePeerDependencies: + - axios + + '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@pythnetwork/price-service-sdk': 1.8.0 + '@types/ws': 8.5.13 + axios: 1.7.9 + axios-retry: 3.9.1 + isomorphic-ws: 4.0.1(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ts-log: 2.2.7 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + '@pythnetwork/price-service-sdk@1.8.0': + dependencies: + bn.js: 5.2.1 + '@raydium-io/raydium-sdk-v2@0.1.95-alpha(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -4053,6 +4215,14 @@ snapshots: - fastestsmallesttextencoderdecoder - typescript + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': dependencies: '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) @@ -4082,6 +4252,20 @@ snapshots: - encoding - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + '@solana/spl-token@0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -4181,6 +4365,28 @@ snapshots: - encoding - utf-8-validate + '@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.6.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.0.4 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.26.0 @@ -4347,6 +4553,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.17.11': + dependencies: + undici-types: 6.19.8 + '@types/node@22.10.5': dependencies: undici-types: 6.20.0 @@ -4467,6 +4677,11 @@ snapshots: '@ungap/structured-clone@1.2.1': {} + '@zodios/core@10.9.6(axios@1.7.9)(zod@3.24.1)': + dependencies: + axios: 1.7.9 + zod: 3.24.1 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -4555,6 +4770,11 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 + axios-retry@3.9.1: + dependencies: + '@babel/runtime': 7.26.0 + is-retry-allowed: 2.2.0 + axios@0.28.1: dependencies: follow-redirects: 1.15.9 @@ -4779,6 +4999,8 @@ snapshots: crypto-js@4.2.0: {} + data-uri-to-buffer@4.0.1: {} + dayjs@1.11.13: {} debug@2.6.9: @@ -5047,6 +5269,8 @@ snapshots: eventsource-parser@3.0.0: {} + eventsource@2.0.2: {} + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -5133,6 +5357,11 @@ snapshots: dependencies: reusify: 1.0.4 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -5177,6 +5406,34 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flash-sdk@2.24.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10): + dependencies: + '@coral-xyz/anchor': 0.27.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@pythnetwork/client': 2.22.0(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@pythnetwork/price-service-client': 1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@types/node': 20.17.11 + bignumber.js: 9.1.2 + bs58: 5.0.0 + dotenv: 16.4.7 + fs: 0.0.1-security + js-sha256: 0.9.0 + jsbi: 4.3.0 + node-fetch: 3.3.2 + rimraf: 5.0.10 + ts-node: 10.9.2(@types/node@20.17.11)(typescript@5.7.2) + tweetnacl: 1.0.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + flat-cache@3.2.0: dependencies: flatted: 3.3.2 @@ -5214,12 +5471,18 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fresh@0.5.2: {} fs.realpath@1.0.0: {} + fs@0.0.1-security: {} + function-bind@1.1.2: {} get-east-asian-width@1.3.0: {} @@ -5439,6 +5702,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-retry-allowed@2.2.0: {} + is-stream@3.0.0: {} is-typed-array@1.1.15: @@ -5453,6 +5718,10 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws@4.0.1(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -5497,6 +5766,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbi@4.3.0: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -5777,6 +6048,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} npm-run-path@5.3.0: @@ -6284,6 +6561,26 @@ snapshots: dependencies: typescript: 5.7.2 + ts-log@2.2.7: {} + + ts-node@10.9.2(@types/node@20.17.11)(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': 20.17.11 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -6357,6 +6654,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici-types@6.20.0: {} unicode-trie@2.0.0: diff --git a/src/actions/flashCloseTrade.ts b/src/actions/flashCloseTrade.ts new file mode 100644 index 0000000..3781d83 --- /dev/null +++ b/src/actions/flashCloseTrade.ts @@ -0,0 +1,68 @@ +import { Action } from "../types/action"; +import { SolanaAgentKit } from "../agent"; +import { z } from "zod"; +import { flashCloseTrade } from "../tools"; + +const flashCloseTradeAction: Action = { + name: "FLASH_CLOSE_TRADE", + similes: [ + "close trade", + "close leveraged trade", + "exit position", + "close position", + "exit trade", + "close long", + "close short", + "take profit", + "stop loss", + ], + description: + "Close an existing leveraged trading position on Flash.Trade protocol", + examples: [ + [ + { + input: { + token: "SOL", + side: "long", + }, + output: { + status: "success", + signature: "4xKpN2...", + message: "Successfully closed long position on SOL", + }, + explanation: "Close an existing long position on SOL", + }, + ], + ], + schema: z.object({ + token: z + .string() + .describe("Token symbol of the position to close (e.g. SOL, ETH)"), + side: z + .enum(["long", "short"]) + .describe("Position side to close - long or short"), + }), + handler: async (agent: SolanaAgentKit, input: Record) => { + try { + const params = { + token: input.token as string, + side: input.side as "long" | "short", + }; + + const response = await flashCloseTrade(agent, params); + + return { + status: "success", + signature: response, + message: `Successfully closed ${params.side} position on ${params.token}`, + }; + } catch (error: any) { + return { + status: "error", + message: `Flash trade close failed: ${error.message}`, + }; + } + }, +}; + +export default flashCloseTradeAction; diff --git a/src/actions/flashOpenTrade.ts b/src/actions/flashOpenTrade.ts new file mode 100644 index 0000000..790bdef --- /dev/null +++ b/src/actions/flashOpenTrade.ts @@ -0,0 +1,78 @@ +import { Action } from "../types/action"; +import { SolanaAgentKit } from "../agent"; +import { z } from "zod"; +import { flashOpenTrade } from "../tools"; + +const flashOpenTradeAction: Action = { + name: "FLASH_OPEN_TRADE", + similes: [ + "open trade", + "open leveraged trade", + "start trading position", + "open position", + "long position", + "short position", + "leverage trade", + "margin trade", + ], + description: "Open a leveraged trading position on Flash.Trade protocol", + examples: [ + [ + { + input: { + token: "SOL", + side: "long", + collateralUsd: 100, + leverage: 5, + }, + output: { + status: "success", + signature: "4xKpN2...", + message: + "Successfully opened 5x long position on SOL with $100 collateral", + }, + explanation: + "Open a 5x leveraged long position on SOL using $100 as collateral", + }, + ], + ], + schema: z.object({ + token: z.string().describe("Token symbol to trade (e.g. SOL, ETH)"), + side: z + .enum(["long", "short"]) + .describe("Trading direction - long or short"), + collateralUsd: z + .number() + .positive() + .describe("Amount of collateral in USD"), + leverage: z + .number() + .positive() + .describe("Leverage multiplier for the trade"), + }), + handler: async (agent: SolanaAgentKit, input: Record) => { + try { + const params = { + token: input.token as string, + side: input.side as "long" | "short", + collateralUsd: input.collateralUsd as number, + leverage: input.leverage as number, + }; + + const response = await flashOpenTrade(agent, params); + + return { + status: "success", + signature: response, + message: `Successfully opened ${params.leverage}x ${params.side} position on ${params.token} with $${params.collateralUsd} collateral`, + }; + } catch (error: any) { + return { + status: "error", + message: `Flash trade failed: ${error.message}`, + }; + } + }, +}; + +export default flashOpenTradeAction; diff --git a/src/actions/index.ts b/src/actions/index.ts index 60e7df4..c974209 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -28,6 +28,8 @@ import raydiumCreateAmmV4Action from "./raydiumCreateAmmV4"; import createOrcaSingleSidedWhirlpoolAction from "./createOrcaSingleSidedWhirlpool"; import launchPumpfunTokenAction from "./launchPumpfunToken"; import getWalletAddressAction from "./getWalletAddress"; +import flashOpenTradeAction from "./flashOpenTrade"; +import flashCloseTradeAction from "./flashCloseTrade"; export const ACTIONS = { WALLET_ADDRESS_ACTION: getWalletAddressAction, @@ -61,6 +63,8 @@ export const ACTIONS = { CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL_ACTION: createOrcaSingleSidedWhirlpoolAction, LAUNCH_PUMPFUN_TOKEN_ACTION: launchPumpfunTokenAction, + FLASH_OPEN_TRADE_ACTION: flashOpenTradeAction, + FLASH_CLOSE_TRADE_ACTION: flashCloseTradeAction, }; export type { Action, ActionExample, Handler } from "../types/action"; diff --git a/src/agent/index.ts b/src/agent/index.ts index a28c899..0468224 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -60,6 +60,8 @@ import { fetchTokenDetailedReport, fetchPythPrice, fetchPythPriceFeedID, + flashOpenTrade, + flashCloseTrade, } from "../tools"; import { CollectionDeployment, @@ -70,6 +72,8 @@ import { PumpfunLaunchResponse, PumpFunTokenOptions, OrderParams, + FlashTradeParams, + FlashCloseTradeParams, } from "../types"; /** @@ -541,4 +545,22 @@ export class SolanaAgentKit { async fetchTokenDetailedReport(mint: string): Promise { return fetchTokenDetailedReport(mint); } + + /** + * Opens a new trading position on Flash.Trade + * @param params Flash trade parameters including market, side, collateral, leverage, and pool name + * @returns Transaction signature + */ + async flashOpenTrade(params: FlashTradeParams): Promise { + return flashOpenTrade(this, params); + } + + /** + * Closes an existing trading position on Flash.Trade + * @param params Flash trade close parameters + * @returns Transaction signature + */ + async flashCloseTrade(params: FlashCloseTradeParams): Promise { + return flashCloseTrade(this, params); + } } diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 97810e8..bcb824d 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -774,6 +774,133 @@ export class SolanaGetWalletAddressTool extends Tool { } } +export class SolanaFlashOpenTrade extends Tool { + name = "solana_flash_open_trade"; + description = `This tool can be used to open a new leveraged trading position on Flash.Trade exchange. + + Inputs ( input is a JSON string ): + token: string, eg "SOL", "BTC", "ETH" (required) + type: string, eg "long", "short" (required) + collateral: number, eg 10, 100, 1000 (required) + leverage: number, eg 5, 10, 20 (required) + + Example prompt is Open a 20x leveraged trade for SOL on long side using flash trade with 500 USD as collateral`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + + console.log(parsedInput); + + // Validate input parameters + if (!parsedInput.token) { + throw new Error("Token is required, received: " + parsedInput.token); + } + if (!["SOL", "BTC", "ETH", "USDC"].includes(parsedInput.token)) { + throw new Error( + 'Token must be one of ["SOL", "BTC", "ETH", "USDC"], received: ' + + parsedInput.token, + ); + } + if (!["long", "short"].includes(parsedInput.type)) { + throw new Error( + 'Type must be either "long" or "short", received: ' + + parsedInput.type, + ); + } + if (!parsedInput.collateral || parsedInput.collateral <= 0) { + throw new Error( + "Collateral amount must be positive, received: " + + parsedInput.collateral, + ); + } + if (!parsedInput.leverage || parsedInput.leverage <= 0) { + throw new Error( + "Leverage must be positive, received: " + parsedInput.leverage, + ); + } + + const tx = await this.solanaKit.flashOpenTrade({ + token: parsedInput.token, + side: parsedInput.type, + collateralUsd: parsedInput.collateral, + leverage: parsedInput.leverage, + }); + + return JSON.stringify({ + status: "success", + message: "Flash trade position opened successfully", + transaction: tx, + token: parsedInput.token, + side: parsedInput.type, + collateral: parsedInput.collateral, + leverage: parsedInput.leverage, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaFlashCloseTrade extends Tool { + name = "solana_flash_close_trade"; + description = `Close an existing leveraged trading position on Flash.Trade exchange. + + Inputs ( input is a JSON string ): + token: string, eg "SOL", "BTC", "ETH" (required) + side: string, eg "long", "short" (required) + + Example prompt is Close a 20x leveraged trade for SOL on long side`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + + // Validate input parameters + if (!parsedInput.token) { + throw new Error("Token is required"); + } + if (!["SOL", "BTC", "ETH"].includes(parsedInput.token)) { + throw new Error('Token must be one of ["SOL", "BTC", "ETH"]'); + } + if (!["long", "short"].includes(parsedInput.side)) { + throw new Error('Side must be either "long" or "short"'); + } + + const tx = await this.solanaKit.flashCloseTrade({ + token: parsedInput.token, + side: parsedInput.side, + }); + + return JSON.stringify({ + status: "success", + message: "Flash trade position closed successfully", + transaction: tx, + token: parsedInput.token, + side: parsedInput.side, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + export class SolanaPumpfunTokenLaunchTool extends Tool { name = "solana_launch_pumpfun_token"; @@ -2179,5 +2306,7 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaFetchTokenDetailedReportTool(solanaKit), new SolanaPerpOpenTradeTool(solanaKit), new SolanaPerpCloseTradeTool(solanaKit), + new SolanaFlashOpenTrade(solanaKit), + new SolanaFlashCloseTrade(solanaKit), ]; } diff --git a/src/tools/flash_close_trade.ts b/src/tools/flash_close_trade.ts new file mode 100644 index 0000000..318eb8d --- /dev/null +++ b/src/tools/flash_close_trade.ts @@ -0,0 +1,123 @@ +import { PublicKey, ComputeBudgetProgram } from "@solana/web3.js"; +import { + PerpetualsClient, + OraclePrice, + PoolConfig, + Privilege, + Side, +} from "flash-sdk"; +import { BN } from "@coral-xyz/anchor"; +import { SolanaAgentKit } from "../index"; +import { + CLOSE_POSITION_CU, + marketSdkInfo, + marketTokenMap, + getNftTradingAccountInfo, + fetchOraclePrice, + createPerpClient, +} from "../utils/flashUtils"; +import { FlashCloseTradeParams } from "../types"; + +/** + * Closes an existing position on Flash.Trade + * @param agent SolanaAgentKit instance + * @param params Trade parameters + * @returns Transaction signature + */ +export async function flashCloseTrade( + agent: SolanaAgentKit, + params: FlashCloseTradeParams, +): Promise { + try { + const { token, side } = params; + + // Get market ID from token and side using marketTokenMap + const tokenMarkets = marketTokenMap[token]; + if (!tokenMarkets) { + throw new Error(`Token ${token} not supported for trading`); + } + + const sideEntry = tokenMarkets[side]; + if (!sideEntry) { + throw new Error(`${side} side not available for ${token}`); + } + + const market = sideEntry.marketID; + + // Validate market data using marketSdkInfo + const marketData = marketSdkInfo[market]; + if (!marketData) { + throw new Error(`Invalid market configuration for ${token}/${side}`); + } + + // Get token information + const [targetSymbol, collateralSymbol] = marketData.tokenPair.split("/"); + + // Fetch oracle prices + const [targetPrice, collateralPrice] = await Promise.all([ + fetchOraclePrice(targetSymbol), + fetchOraclePrice(collateralSymbol), + ]); + + // Initialize pool configuration and perpClient + const poolConfig = PoolConfig.fromIdsByName( + marketData.pool, + "mainnet-beta", + ); + const perpClient = createPerpClient(agent.connection, agent.wallet); + + // Calculate price after slippage + const slippageBpsBN = new BN(100); // 1% slippage + const sideEnum = side === "long" ? Side.Long : Side.Short; + const priceWithSlippage = perpClient.getPriceAfterSlippage( + false, // isEntry = false for closing position + slippageBpsBN, + targetPrice.price, + sideEnum, + ); + + // Get NFT trading account info + const tradingAccounts = await getNftTradingAccountInfo( + agent.wallet_address, + perpClient, + poolConfig, + collateralSymbol, + ); + + if ( + !tradingAccounts.nftTradingAccountPk || + !tradingAccounts.nftReferralAccountPK || + !tradingAccounts.nftOwnerRebateTokenAccountPk + ) { + throw new Error("Required NFT trading accounts not found"); + } + + // Build and send transaction + const { instructions, additionalSigners } = await perpClient.closePosition( + targetSymbol, + collateralSymbol, + priceWithSlippage, + sideEnum, + poolConfig, + Privilege.Referral, + tradingAccounts.nftTradingAccountPk, + tradingAccounts.nftReferralAccountPK, + tradingAccounts.nftOwnerRebateTokenAccountPk, + ); + + const computeBudgetIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: CLOSE_POSITION_CU, + }); + + return await perpClient.sendTransaction( + [computeBudgetIx, ...instructions], + { + additionalSigners: additionalSigners, + alts: perpClient.addressLookupTables, + prioritizationFee: 5000000, + }, + ); + } catch (error) { + throw new Error(`Flash trade close failed: ${error}`); + } +} diff --git a/src/tools/flash_open_trade.ts b/src/tools/flash_open_trade.ts new file mode 100644 index 0000000..148e373 --- /dev/null +++ b/src/tools/flash_open_trade.ts @@ -0,0 +1,251 @@ +import { PublicKey, ComputeBudgetProgram } from "@solana/web3.js"; +import { + PerpetualsClient, + OraclePrice, + PoolConfig, + Privilege, + Side, + CustodyAccount, + Custody, +} from "flash-sdk"; +import { BN } from "@coral-xyz/anchor"; +import { SolanaAgentKit } from "../index"; +import { + ALL_TOKENS, + marketSdkInfo, + marketTokenMap, + getNftTradingAccountInfo, + OPEN_POSITION_CU, + fetchOraclePrice, + createPerpClient, +} from "../utils/flashUtils"; +import { FlashTradeParams } from "../types"; + +/** + * Opens a new position on Flash.Trade + * @param agent SolanaAgentKit instance + * @param params Trade parameters + * @returns Transaction signature + */ +export async function flashOpenTrade( + agent: SolanaAgentKit, + params: FlashTradeParams, +): Promise { + try { + const { token, side, collateralUsd, leverage } = params; + + // Get market ID from token and side using marketTokenMap + const tokenMarkets = marketTokenMap[token]; + if (!tokenMarkets) { + throw new Error(`Token ${token} not supported for trading`); + } + + const sideEntry = tokenMarkets[side]; + if (!sideEntry) { + throw new Error(`${side} side not available for ${token}`); + } + + const market = sideEntry.marketID; + + // Validate market data using marketSdkInfo + const marketData = marketSdkInfo[market]; + if (!marketData) { + throw new Error(`Invalid market configuration for ${token}/${side}`); + } + + // Get token information + const [targetSymbol, collateralSymbol] = marketData.tokenPair.split("/"); + const targetToken = ALL_TOKENS.find((t) => t.symbol === targetSymbol); + const collateralToken = ALL_TOKENS.find( + (t) => t.symbol === collateralSymbol, + ); + + if (!targetToken || !collateralToken) { + throw new Error(`Token not found for pair ${marketData.tokenPair}`); + } + + // Fetch oracle prices + const [targetPrice, collateralPrice] = await Promise.all([ + fetchOraclePrice(targetSymbol), + fetchOraclePrice(collateralSymbol), + ]); + + // Initialize pool configuration and perpClient + const poolConfig = PoolConfig.fromIdsByName( + marketData.pool, + "mainnet-beta", + ); + const perpClient = createPerpClient(agent.connection, agent.wallet); + + // Calculate position parameters + const leverageBN = new BN(leverage); + const collateralTokenPrice = convertPriceToNumber(collateralPrice.price); + const collateralAmount = calculateCollateralAmount( + collateralUsd, + collateralTokenPrice, + collateralToken.decimals, + ); + + // Get custody accounts + const { targetCustody, collateralCustody } = await fetchCustodyAccounts( + perpClient, + poolConfig, + targetSymbol, + collateralSymbol, + ); + + // Calculate position size + const positionSize = calculatePositionSize( + perpClient, + collateralAmount, + leverageBN, + targetToken, + collateralToken, + side, + targetPrice.price, + collateralPrice.price, + targetCustody, + collateralCustody, + ); + + // Get NFT trading account info + const tradingAccounts = await getNftTradingAccountInfo( + agent.wallet_address, + perpClient, + poolConfig, + collateralSymbol, + ); + + if ( + !tradingAccounts.nftTradingAccountPk || + !tradingAccounts.nftReferralAccountPK + ) { + throw new Error("Required NFT trading accounts not found"); + } + + // Prepare transaction + const slippageBps = new BN(1000); + const priceWithSlippage = perpClient.getPriceAfterSlippage( + true, + slippageBps, + targetPrice.price, + side === "long" ? Side.Long : Side.Short, + ); + + // Build and send transaction + const { instructions, additionalSigners } = await perpClient.openPosition( + targetSymbol, + collateralSymbol, + priceWithSlippage, + collateralAmount, + positionSize, + side === "long" ? Side.Long : Side.Short, + poolConfig, + Privilege.Referral, + tradingAccounts.nftTradingAccountPk, + tradingAccounts.nftReferralAccountPK, + tradingAccounts.nftOwnerRebateTokenAccountPk!, + false, + ); + + const computeBudgetIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: OPEN_POSITION_CU, + }); + + return await perpClient.sendTransaction( + [computeBudgetIx, ...instructions], + { + additionalSigners: additionalSigners, + alts: perpClient.addressLookupTables, + prioritizationFee: 5000000, + }, + ); + } catch (error) { + throw new Error(`Flash trade failed: ${error}`); + } +} + +// Helper functions +function convertPriceToNumber(oraclePrice: OraclePrice): number { + const price = parseInt(oraclePrice.price.toString("hex"), 16); + const exponent = parseInt(oraclePrice.exponent.toString("hex"), 16); + return price * Math.pow(10, exponent); +} + +function calculateCollateralAmount( + usdAmount: number, + tokenPrice: number, + decimals: number, +): BN { + return new BN((usdAmount / tokenPrice) * Math.pow(10, decimals)); +} + +async function fetchCustodyAccounts( + perpClient: PerpetualsClient, + poolConfig: PoolConfig, + targetSymbol: string, + collateralSymbol: string, +) { + const targetConfig = poolConfig.custodies.find( + (c) => c.symbol === targetSymbol, + ); + const collateralConfig = poolConfig.custodies.find( + (c) => c.symbol === collateralSymbol, + ); + + if (!targetConfig || !collateralConfig) { + throw new Error("Custody configuration not found"); + } + + const accounts = await perpClient.provider.connection.getMultipleAccountsInfo( + [targetConfig.custodyAccount, collateralConfig.custodyAccount], + ); + + if (!accounts[0] || !accounts[1]) { + throw new Error("Failed to fetch custody accounts"); + } + + return { + targetCustody: CustodyAccount.from( + targetConfig.custodyAccount, + perpClient.program.coder.accounts.decode( + "custody", + accounts[0].data, + ), + ), + collateralCustody: CustodyAccount.from( + collateralConfig.custodyAccount, + perpClient.program.coder.accounts.decode( + "custody", + accounts[1].data, + ), + ), + }; +} + +function calculatePositionSize( + perpClient: PerpetualsClient, + collateralAmount: BN, + leverage: BN, + targetToken: any, + collateralToken: any, + side: "long" | "short", + targetPrice: OraclePrice, + collateralPrice: OraclePrice, + targetCustody: CustodyAccount, + collateralCustody: CustodyAccount, +): BN { + return perpClient.getSizeAmountFromLeverageAndCollateral( + collateralAmount, + leverage.toString(), + targetToken, + collateralToken, + side === "long" ? Side.Long : Side.Short, + targetPrice, + targetPrice, + targetCustody, + collateralPrice, + collateralPrice, + collateralCustody, + ); +} diff --git a/src/tools/index.ts b/src/tools/index.ts index 2544fed..483a77c 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -47,3 +47,6 @@ export * from "./tensor_trade"; export * from "./trade"; export * from "./transfer"; export * from "./withdraw_all"; + +export * from "./flash_open_trade"; +export * from "./flash_close_trade"; \ No newline at end of file diff --git a/src/types/index.ts b/src/types/index.ts index ad88ec8..71dab5d 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -224,3 +224,15 @@ export interface BatchOrderPattern { numberOfOrders?: number; individualQuantity?: number; } + +export interface FlashTradeParams { + token: string; + side: "long" | "short"; + collateralUsd: number; + leverage: number; +} + +export interface FlashCloseTradeParams { + token: string; + side: "long" | "short"; +} diff --git a/src/utils/flashUtils.ts b/src/utils/flashUtils.ts new file mode 100644 index 0000000..87cda80 --- /dev/null +++ b/src/utils/flashUtils.ts @@ -0,0 +1,280 @@ +import { HermesClient } from "@pythnetwork/hermes-client"; +import { OraclePrice } from "flash-sdk"; +import { AnchorProvider, BN, Wallet } from "@coral-xyz/anchor"; +import { PoolConfig, Token, Referral, PerpetualsClient } from "flash-sdk"; +import { Cluster, PublicKey, Connection, Keypair } from "@solana/web3.js"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; + +const POOL_NAMES = [ + "Crypto.1", + "Virtual.1", + "Governance.1", + "Community.1", + "Community.2", + "Community.3", +]; + +const DEFAULT_CLUSTER: Cluster = "mainnet-beta"; +export const POOL_CONFIGS = POOL_NAMES.map((f) => + PoolConfig.fromIdsByName(f, DEFAULT_CLUSTER), +); + +const DUPLICATE_TOKENS = POOL_CONFIGS.map((f) => f.tokens).flat(); +const tokenMap = new Map(); +for (const token of DUPLICATE_TOKENS) { + tokenMap.set(token.symbol, token); +} +export const ALL_TOKENS: Token[] = Array.from(tokenMap.values()); +export const ALL_CUSTODIES = POOL_CONFIGS.map((f) => f.custodies).flat(); +const PROGRAM_ID = POOL_CONFIGS[0].programId; + +// CU for trade instructions +export const OPEN_POSITION_CU = 150_000; +export const CLOSE_POSITION_CU = 180_000; + +const HERMES_URL = "https://hermes.pyth.network"; // Replace with the actual Hermes URL if different + +// Create a map of symbol to Pyth price ID +const PRICE_FEED_IDS = ALL_TOKENS.reduce( + (acc, token) => { + acc[token.symbol] = token.pythPriceId; + return acc; + }, + {} as { [key: string]: string }, +); + +const hermesClient = new HermesClient(HERMES_URL, {}); + +export interface PythPriceEntry { + price: OraclePrice; + emaPrice: OraclePrice; + isStale: boolean; + status: PriceStatus; +} + +export enum PriceStatus { + Trading, + Unknown, + Halted, + Auction, +} + +export const fetchOraclePrice = async ( + symbol: string, +): Promise => { + const priceFeedId = PRICE_FEED_IDS[symbol]; + if (!priceFeedId) { + throw new Error(`Price feed ID not found for symbol: ${symbol}`); + } + + try { + const hermesPriceFeed = await hermesClient.getPriceFeeds({ + query: symbol, + filter: "crypto", + }); + + if (!hermesPriceFeed || hermesPriceFeed.length === 0) { + throw new Error(`No price feed received for ${symbol}`); + } + + const hemrmesPriceUdpate = await hermesClient.getLatestPriceUpdates( + [priceFeedId], + { + encoding: "hex", + parsed: true, + }, + ); + + if (!hemrmesPriceUdpate.parsed) { + throw new Error(`No price feed received for ${symbol}`); + } + const hermesEma = hemrmesPriceUdpate.parsed[0].ema_price; + const hermesPrice = hemrmesPriceUdpate.parsed[0].price; + + const hermesPriceOracle = new OraclePrice({ + price: new BN(hermesPrice.price), + exponent: new BN(hermesPrice.expo), + confidence: new BN(hermesPrice.conf), + timestamp: new BN(hermesPrice.publish_time), + }); + + const hermesEmaOracle = new OraclePrice({ + price: new BN(hermesEma.price), + exponent: new BN(hermesEma.expo), + confidence: new BN(hermesEma.conf), + timestamp: new BN(hermesEma.publish_time), + }); + + const token = ALL_TOKENS.find((t) => t.pythPriceId === priceFeedId); + if (!token) { + throw new Error(`Token not found for price feed ID: ${priceFeedId}`); + } + + const status = !token.isVirtual ? PriceStatus.Trading : PriceStatus.Unknown; + + const pythPriceEntry: PythPriceEntry = { + price: hermesPriceOracle, + emaPrice: hermesEmaOracle, + isStale: false, + status: status, + }; + + return pythPriceEntry; + } catch (error) { + console.error(`Error in fetchOraclePrice for ${symbol}:`, error); + throw error; + } +}; + +export interface MarketInfo { + [key: string]: { + tokenPair: string; + token: string; + side: string; + pool: string; + }; +} + +const marketSdkInfo: MarketInfo = {}; + +// Loop through POOL_CONFIGS to process each market +POOL_CONFIGS.forEach((poolConfig) => { + poolConfig.markets.forEach((market) => { + const targetToken = ALL_TOKENS.find( + (token) => token.mintKey.toString() === market.targetMint.toString(), + ); + + // Find collateral token by matching mintKey + const collateralToken = ALL_TOKENS.find( + (token) => token.mintKey.toString() === market.collateralMint.toString(), + ); + + if (targetToken?.symbol && collateralToken?.symbol) { + marketSdkInfo[market.marketAccount.toString()] = { + tokenPair: `${targetToken.symbol}/${collateralToken.symbol}`, + token: targetToken.symbol, + side: Object.keys(market.side)[0], + pool: poolConfig.poolName, + }; + } + }); +}); + +export { marketSdkInfo }; + +export interface MarketTokenSides { + [token: string]: { + long?: { marketID: string }; + short?: { marketID: string }; + }; +} + +const marketTokenMap: MarketTokenSides = {}; + +// Convert marketSdkInfo into marketTokenMap +Object.entries(marketSdkInfo).forEach(([marketID, info]) => { + if (!marketTokenMap[info.token]) { + marketTokenMap[info.token] = {}; + } + + marketTokenMap[info.token][info.side.toLowerCase() as "long" | "short"] = { + marketID, + }; +}); + +export { marketTokenMap }; + +interface TradingAccountResult { + nftReferralAccountPK: PublicKey | null; + nftTradingAccountPk: PublicKey | null; + nftOwnerRebateTokenAccountPk: PublicKey | null; +} + +export async function getNftTradingAccountInfo( + userPublicKey: PublicKey, + perpClient: PerpetualsClient, + poolConfig: PoolConfig, + collateralCustodySymbol: string, +): Promise { + const getNFTReferralAccountPK = (publicKey: PublicKey) => { + return PublicKey.findProgramAddressSync( + [Buffer.from("referral"), publicKey.toBuffer()], + PROGRAM_ID, + )[0]; + }; + const nftReferralAccountPK = getNFTReferralAccountPK(userPublicKey); + const nftReferralAccountInfo = + await perpClient.provider.connection.getAccountInfo(nftReferralAccountPK); + + let nftTradingAccountPk: PublicKey | null = null; + let nftOwnerRebateTokenAccountPk: PublicKey | null = null; + + if (nftReferralAccountInfo) { + const nftReferralAccountData = perpClient.program.coder.accounts.decode( + "referral", + nftReferralAccountInfo.data, + ) as Referral; + + nftTradingAccountPk = nftReferralAccountData.refererTradingAccount; + + if (nftTradingAccountPk) { + const nftTradingAccountInfo = + await perpClient.provider.connection.getAccountInfo( + nftTradingAccountPk, + ); + if (nftTradingAccountInfo) { + const nftTradingAccount = perpClient.program.coder.accounts.decode( + "trading", + nftTradingAccountInfo.data, + ) as { owner: PublicKey }; + + nftOwnerRebateTokenAccountPk = getAssociatedTokenAddressSync( + poolConfig.getTokenFromSymbol(collateralCustodySymbol).mintKey, + nftTradingAccount.owner, + ); + // Check if the account exists + const accountExists = + await perpClient.provider.connection.getAccountInfo( + nftOwnerRebateTokenAccountPk, + ); + if (!accountExists) { + console.log( + "NFT owner rebate token account does not exist and may need to be created", + ); + } + } + } + } + + return { + nftReferralAccountPK, + nftTradingAccountPk, + nftOwnerRebateTokenAccountPk, + }; +} + +/** + * Creates a new PerpetualsClient instance with the given connection and wallet + * @param connection Solana connection + * @param wallet Solana wallet + * @returns PerpetualsClient instance + */ +export function createPerpClient( + connection: Connection, + wallet: Keypair, +): PerpetualsClient { + const provider = new AnchorProvider(connection, new Wallet(wallet), { + commitment: "confirmed", + preflightCommitment: "confirmed", + skipPreflight: true, + }); + + return new PerpetualsClient( + provider, + POOL_CONFIGS[0].programId, + POOL_CONFIGS[0].perpComposibilityProgramId, + POOL_CONFIGS[0].fbNftRewardProgramId, + POOL_CONFIGS[0].rewardDistributionProgram.programId, + {}, + ); +}