diff --git a/.env.example b/.env.example index e8004fd..bd420ff 100644 --- a/.env.example +++ b/.env.example @@ -2,4 +2,6 @@ OPENAI_API_KEY= RPC_URL= SOLANA_PRIVATE_KEY= JUPITER_REFERRAL_ACCOUNT= -JUPITER_FEE_BPS= \ No newline at end of file +JUPITER_FEE_BPS= +FLASH_PRIVILEGE= referral | nft | none +HELIUS_API_KEY= \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index e619c84..3b8e4c6 100644 --- a/.eslintrc +++ b/.eslintrc @@ -13,6 +13,7 @@ "no-constant-condition": "off", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-object-type": "off", "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], "no-console": ["warn", { "allow": ["warn", "error"] }], "curly": ["error", "all"], @@ -30,4 +31,4 @@ "ecmaVersion": 2020, "sourceType": "module" } -} \ No newline at end of file +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c862186..6b4d5a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,9 @@ jobs: with: version: 9.4.0 + - name: Install node-gyp prerequisites + run: sudo apt update && sudo apt install -y build-essential python3 pkg-config libudev-dev libusb-1.0-0-dev + - uses: actions/setup-node@v4 with: node-version: "23" @@ -21,7 +24,7 @@ jobs: - name: Install dependencies run: pnpm install -r --no-frozen-lockfile - + - name: Run lint and fix run: pnpm run lint:fix diff --git a/.lintstagedrc b/.lintstagedrc index d2aefcf..021c8d8 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,6 +1,5 @@ { - "**/*.+(js|jsx|css|less|scss|ts|tsx|md)": [ - "prettier --write", - "eslint --fix" + "**/*.+(ts|tsx)": [ + "eslint . --ext .ts --fix" ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index ee42e5e..f796ed3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ ![Solana Agent Kit Cover 1 (3)](https://github.com/user-attachments/assets/cfa380f6-79d9-474d-9852-3e1976c6de70) - ![NPM Downloads](https://img.shields.io/npm/dm/solana-agent-kit?style=for-the-badge) ![GitHub forks](https://img.shields.io/github/forks/sendaifun/solana-agent-kit?style=for-the-badge) ![GitHub License](https://img.shields.io/github/license/sendaifun/solana-agent-kit?style=for-the-badge) @@ -23,7 +22,6 @@ An open-source toolkit for connecting AI agents to Solana protocols. Now, any ag Anyone - whether an SF-based AI researcher or a crypto-native builder - can bring their AI agents trained with any model and seamlessly integrate with Solana. - [![Run on Repl.it](https://replit.com/badge/github/sendaifun/solana-agent-kit)](https://replit.com/@sendaifun/Solana-Agent-Kit) > Replit template created by [Arpit Singh](https://github.com/The-x-35) @@ -58,6 +56,7 @@ Anyone - whether an SF-based AI researcher or a crypto-native builder - can brin - Pyth Price feeds for fetching Asset Prices - Register/resolve Alldomains - Perpetuals Trading with Adrena Protocol + - Drift Vaults, Perps, Lending and Borrowing - **Solana Blinks** - Lending by Lulo (Best APR for USDC) @@ -93,6 +92,9 @@ Anyone - whether an SF-based AI researcher or a crypto-native builder - can brin - Price feed integration for market analysis - Automated decision-making capabilities +## 📃 Documentation +You can view the full documentation of the kit at [docs.solanaagentkit.xyz](https://docs.solanaagentkit.xyz) + ## 📦 Installation ```bash @@ -294,6 +296,174 @@ const signature = await agent.closePerpTradeLong({ }); ``` +### Close Empty Token Accounts + +``` typescript + +const { signature } = await agent.closeEmptyTokenAccounts(); +``` + +### Create a Drift account + +Create a drift account with an initial token deposit. + +```typescript +const result = await agent.createDriftUserAccount() +``` + +### Create a Drift Vault + +Create a drift vault. + +```typescript +const signature = await agent.createDriftVault({ + name: "my-drift-vault", + marketName: "USDC-SPOT", + redeemPeriod: 1, // in days + maxTokens: 100000, // in token units e.g 100000 USDC + minDepositAmount: 5, // in token units e.g 5 USDC + managementFee: 1, // 1% + profitShare: 10, // 10% + hurdleRate: 5, // 5% + permissioned: false, // public vault or whitelist +}) +``` + +### Deposit into a Drift Vault + +Deposit tokens into a drift vault. + +```typescript +const signature = await agent.depositIntoDriftVault(100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU") +``` + +### Deposit into your Drift account + +Deposit tokens into your drift account. + +```typescript +const {txSig} = await agent.depositToDriftUserAccount(100, "USDC") +``` + +### Derive a Drift Vault address + +Derive a drift vault address. + +```typescript +const vaultPublicKey = await agent.deriveDriftVaultAddress("my-drift-vault") +``` + +### Do you have a Drift account + +Check if agent has a drift account. + +```typescript +const {hasAccount, account} = await agent.doesUserHaveDriftAccount() +``` + +### Get Drift account information + +Get drift account information. + +```typescript +const accountInfo = await agent.driftUserAccountInfo() +``` + +### Request withdrawal from Drift vault + +Request withdrawal from drift vault. + +```typescript +const signature = await agent.requestWithdrawalFromDriftVault(100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU") +``` + +### Carry out a perpetual trade using a Drift vault + +Open a perpertual trade using a drift vault that is delegated to you. + +```typescript +const signature = await agent.tradeUsingDelegatedDriftVault({ + vault: "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", + amount: 500, + symbol: "SOL", + action: "long", + type: "limit", + price: 180 // Please long limit order at $180/SOL +}) +``` + +### Carry out a perpetual trade using your Drift account + +Open a perpertual trade using your drift account. + +```typescript +const signature = await agent.tradeUsingDriftPerpAccount({ + amount: 500, + symbol: "SOL", + action: "long", + type: "limit", + price: 180 // Please long limit order at $180/SOL +}) +``` + +### Update Drift vault parameters + +Update drift vault parameters. + +```typescript +const signature = await agent.updateDriftVault({ + name: "my-drift-vault", + marketName: "USDC-SPOT", + redeemPeriod: 1, // in days + maxTokens: 100000, // in token units e.g 100000 USDC + minDepositAmount: 5, // in token units e.g 5 USDC + managementFee: 1, // 1% + profitShare: 10, // 10% + hurdleRate: 5, // 5% + permissioned: false, // public vault or whitelist +}) +``` + +### Withdraw from Drift account + +Withdraw tokens from your drift account. + +```typescript +const {txSig} = await agent.withdrawFromDriftAccount(100, "USDC") +``` + +### Borrow from Drift + +Borrow tokens from drift. + +```typescript +const {txSig} = await agent.withdrawFromDriftAccount(1, "SOL", true) +``` + +### Repay Drift loan + +Repay a loan from drift. + +```typescript +const {txSig} = await agent.depositToDriftUserAccount(1, "SOL", true) +``` + +### Withdraw from Drift vault + +Withdraw tokens from a drift vault after the redemption period has elapsed. + +```typescript +const signature = await agent.withdrawFromDriftVault( "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU") +``` + +### Update the address a Drift vault is delegated to + +Update the address a drift vault is delegated to. + +```typescript +const signature = await agent.updateDriftVaultDelegate("41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", "new-address") +``` + ## Examples ### LangGraph Multi-Agent System @@ -334,7 +504,6 @@ Refer to [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines on how to co - ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=sendaifun/solana-agent-kit&type=Date)](https://star-history.com/#sendaifun/solana-agent-kit&Date) @@ -343,7 +512,7 @@ Refer to [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines on how to co Apache-2 License -## Funding +## Funding If you wanna give back any tokens or donations to the OSS community -- The Public Solana Agent Kit Treasury Address: diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 63010a9..ecb07c6 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -17,6 +17,8 @@ --dark-hl-7: #4FC1FF; --light-hl-8: #098658; --dark-hl-8: #B5CEA8; + --light-hl-9: #267F99; + --dark-hl-9: #4EC9B0; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -31,6 +33,7 @@ --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); --code-background: var(--light-code-background); } } @@ -44,6 +47,7 @@ --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); --code-background: var(--dark-code-background); } } @@ -57,6 +61,7 @@ --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); --code-background: var(--light-code-background); } @@ -70,6 +75,7 @@ --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); --code-background: var(--dark-code-background); } @@ -82,4 +88,5 @@ .hl-6 { color: var(--hl-6); } .hl-7 { color: var(--hl-7); } .hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } pre, code { background: var(--code-background); } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 94a19ed..3a34b45 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJyNllGTkzAQgP9LnjvWq96pfaut1ep57dwxvjg+7IWlZAgJkyzajuN/d0o7B5Sw8MID++23sMkSfv4VhAcSc/FkNRhY7NHQN0ViIgqgVMyF1OA9+mk7/iqlXIuJyJSJxfxm9v7f5MW0kKSsqQ3KELoEJPrpOdROnt3edZI/HSAvNDKOC8GpPgLJdOtidDsgQhd+pA7FKZdWa6zqr7DQ9pijoaA1BI4Tb4vT1Q9YLxSvNIna93hOITbZIZB14exzjEtfI8l055TER/SFNT68lF2MlWrw6VJbj5GDGHfgIA/3KUgOqkdZRwo/q+c/1mVVqzACnz1ifxv6YK7A17JQhC6yGZoVEATF1xAnvC+1XUhpS0MrJFDas0vXj3NFvitD9SZ+WEdsjV6aK3EZ5d5VbMQ5za7Mi6Q091AambJPGSSH1OvSVKvCTXuAY7VHSkfOXRgdklfwGjHerDaEea/5ihulHRYOqao2LVOUWdBThznJFzCxxsZnj44F+unl9lXm6w/vbm5nzbNrGW22D0919m9wCp716dA6h9qGN81kWU3/+ZSNrNWNPZGUppoAP+1AbeHd247wBzqJerEZULYwRooHlCXh9RFf61oAI0qUifstdZRR7JFa/wLB1+tAHeGv/7OFIBQ=" \ No newline at end of file +window.navigationData = "eJyNllGTkzAQgP8Lzx3r9bxT+1Zbq+h57dwx3oPjwzZsS4aQMMmi7Tj+d6fQEShh4YUH9ttvYSGb/PgTEB4pmAfPRoGGxQE1fZUUTIIcKAnmgVDgHLppO/4qoUwFkyCVOg7mN7N3fyf/TQtB0ujaIDWh3YNAN61C7eTZ3X0n+eMRslwh47gQnOoDkEg2Nka7BSK0/kfqUJxyaZTCsv4Kc2VOGWryWn3gOPEmP1/dgPVC8Uq9l4cezznEJlsEMtafXcW49DWSSLZWCnxClxvt/J+yi7FSBS5ZKuMwshDjFixk/j55yUH1KOtI4Se5+21sWrYKI3DpE/a3oQ/mCnxGJQv3grvEmDSM2Tb3sKP14+Vj1F+KXBLayKSoV0DgtV5DnPChUGYhhCk0rZBAKsc+cD/OFfkmNdXL73EdsTV6aa7EZQj1/n+NOKfZWmmspNMa+cXn4VhtkeX7Qj9AoUXCi33kkHpd6PJjc+PPw7HaEyUjB5EfHZKX8BoxDlchYdZrvuJGaYeFQ6qyTcsERer11GF2DoCOFTb2ATrl50Vf3b7KfP3+7c3drLmZL6Nw8/hcZ/8CK2Gnzrt4FWobbpvJohyH1bEjMkY1/ol9ocuF5aYdqC28f9MRfkcrUC3CAWULY6R4RFEQXp95al0LYER7qeN+Sx1lFAek1uHI+3odqCP8+Q8guIFL" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 919304b..68faf85 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 aef9659..96303d4 100644 --- a/docs/classes/SolanaAgentKit.html +++ b/docs/classes/SolanaAgentKit.html @@ -1,28 +1,47 @@ 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

Methods

Methods

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

Constructors

  • Parameters

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

    Returns SolanaAgentKit

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

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

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

    Returns SolanaAgentKit

Properties

config: Config

Configuration object

-
connection: Connection

Solana RPC connection

-
wallet: Keypair

Wallet keypair for signing transactions

-
wallet_address: PublicKey

Public key of the wallet

-

Methods

  • Parameters

    • 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>

  • Closes an existing trading position on Flash.Trade

    +
  • Parameters

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

    Returns SolanaAgentKit

  • Properties

    config: Config

    Configuration object

    +
    connection: Connection

    Solana RPC connection

    +
    wallet: Keypair

    Wallet keypair for signing transactions

    +
    wallet_address: PublicKey

    Public key of the wallet

    +

    Methods

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • marketId: PublicKey

      Returns Promise<string>

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

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • optionsWithBase58: StoreInitOptions
      • collectionOpts: CreateCollectionOptions

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • depositAmount: number
      • depositSymbol: string

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

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<GibworkCreateTaskReponse>

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • creator: PublicKey

      Returns Promise<string>

    • Parameters

      • amount: number
      • OptionalsplmintAddress: PublicKey

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

    • Parameters

      • webhookID: string

      Returns Promise<any>

    • Parameters

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

      Returns Promise<{ mint: PublicKey }>

    • Parameters

      • amount: number
      • vault: string

      Returns Promise<string>

    • Parameters

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

      Returns Promise<TxSigAndSlot>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • name: string

      Returns Promise<PublicKey>

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

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

    • Parameters

      • OptionaltransactionIndex: number | bigint

      Returns Promise<string>

    • Parameters

      • mint: string

      Returns Promise<string>

    • Opens a new trading position on Flash.Trade

      Parameters

      • params: FlashTradeParams

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

      Returns Promise<string>

      Transaction signature

      -
    • Returns Promise<string[]>

    • Returns Promise<string[]>

    • Parameters

      • Optionaltoken_address: PublicKey

      Returns Promise<number>

    • Parameters

      • walletAddress: PublicKey
      • OptionaltokenAddress: PublicKey

      Returns Promise<number>

    • Parameters

      • owner: PublicKey

      Returns Promise<null | string>

    • Parameters

      • owner: PublicKey

      Returns Promise<string[]>

    • Parameters

      • tld: string

      Returns Promise<string[]>

    • Parameters

      • account: PublicKey

      Returns Promise<string>

    • Parameters

      • priceFeedID: string

      Returns Promise<string>

    • Parameters

      • tokenSymbol: string

      Returns Promise<string>

    • Parameters

      • amount: number

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • baseMint: PublicKey
      • quoteMint: PublicKey

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<MintCollectionNFTResponse>

    • Parameters

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

      Returns Promise<string[]>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • positionMintAddress: PublicKey

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

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

      Returns Promise<string>

    • Parameters

      • name: string
      • OptionalspaceKB: number

      Returns Promise<string>

    • Parameters

      • 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 e96b027..af2ba46 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
          | 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
      )[]

    +createSolanaTools | solana-agent-kit

    Function createSolanaTools

    • Parameters

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

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

    Function createVercelAITools

    +createVercelAITools | solana-agent-kit

    Function createVercelAITools

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

    Function executeAction

    • Execute an action with the given input

      -

      Parameters

      Returns Promise<Record<string, any>>

    +

    Parameters

    Returns Promise<Record<string, any>>

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

    Function findAction

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

      -

      Parameters

      • query: string

      Returns Action | undefined

    +

    Parameters

    Returns Action | undefined

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

    Function getActionExamples

    • Get examples for an action

      -

      Parameters

      • action: Action

      Returns string

    +

    Parameters

    Returns string

    diff --git a/docs/index.html b/docs/index.html index 4496ee0..97f6b6b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -31,6 +31,14 @@
  • +

    NFTs on 3.Land

    + +
  • +
  • NFT Management via Metaplex

  • @@ -109,6 +118,7 @@
  • +

    You can view the full documentation of the kit at docs.solanaagentkit.xyz

    npm install solana-agent-kit
     
    @@ -118,6 +128,13 @@
    const result = await agent.deployToken(
    "my ai token", // name
    "uri", // uri
    "token", // symbol
    9, // decimals
    1000000 // initial supply
    );

    console.log("Token Mint Address:", result.mint.toString());
    +
    const optionsWithBase58: StoreInitOptions = {
    privateKey: "",
    isMainnet: true, // if false, collection will be created on devnet 3.land (dev.3.land)
    };

    const collectionOpts: CreateCollectionOptions = {
    collectionName: "",
    collectionSymbol: "",
    collectionDescription: "",
    mainImageUrl: ""
    };

    const result = await agent.create3LandCollection(
    optionsWithBase58,
    collectionOpts
    ); +
    + +

    When creating an NFT using 3Land's tool, it automatically goes for sale on 3.land website

    +
    const optionsWithBase58: StoreInitOptions = {
    privateKey: "",
    isMainnet: true, // if false, listing will be on devnet 3.land (dev.3.land)
    };
    const collectionAccount = ""; //hash for the collection
    const createItemOptions: CreateSingleOptions = {
    itemName: "",
    sellerFee: 500, //5%
    itemAmount: 100, //total items to be created
    itemSymbol: "",
    itemDescription: "",
    traits: [
    { trait_type: "", value: "" },
    ],
    price: 0, //100000000 == 0.1 sol, can be set to 0 for a free mint
    mainImageUrl: "",
    splHash: "", //present if listing is on a specific SPL token, if not present sale will be on $SOL
    };
    const isMainnet = true;
    const result = await agent.create3LandNft(
    optionsWithBase58,
    collectionAccount,
    createItemOptions,
    isMainnet
    );
    +
    +
    const collection = await agent.deployCollection({
    name: "My NFT Collection",
    uri: "https://arweave.net/metadata.json",
    royaltyBasisPoints: 500, // 5%
    creators: [
    {
    address: "creator-wallet-address",
    percentage: 100,
    },
    ],
    });
    @@ -145,6 +162,73 @@
    import { PublicKey } from "@solana/web3.js";

    const signature = await agent.closePerpTradeLong({
    price: 200, // $200 SOL price
    tradeMint: new PublicKey("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"), // jitoSOL
    });
    +

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

    Create a drift account with an initial token deposit.

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

    Create a drift vault.

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

    Deposit tokens into a drift vault.

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

    Deposit tokens into your drift account.

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

    Derive a drift vault address.

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

    Check if agent has a drift account.

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

    Get drift account information.

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

    Request withdrawal from drift vault.

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

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

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

    Open a perpertual trade using your drift account.

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

    Update drift vault parameters.

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

    Withdraw tokens from your drift account.

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

    Borrow tokens from drift.

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

    Repay a loan from drift.

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

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

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

    Update the address a drift vault is delegated to.

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

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