An open-source toolkit for connecting AI agents to Solana protocols. Now, any agent, using any model can autonomously perform 60+ Solana actions:
- Trade tokens
 - Launch new tokens
 - Lend assets
 - Send compressed airdrops
 - Execute blinks
 - Launch tokens on AMMs
 - Bridge tokens across chains
 - And more...
 
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.
Replit template created by Arpit Singh
- 
Token Operations
- Deploy SPL tokens by Metaplex
 - Transfer assets
 - Balance checks
 - Stake SOL
 - Zk compressed Airdrop by Light Protocol and Helius
 - Bridge tokens across chains using Wormhole
 
 - 
NFTs on 3.Land
- Create your own collection
 - NFT creation and automatic listing on 3.land
 - List your NFT for sale in any SPL token
 
 - 
NFT Management via Metaplex
- Collection deployment
 - NFT minting
 - Metadata management
 - Royalty configuration
 
 - 
DeFi Integration
- Jupiter Exchange swaps
 - Launch on Pump via PumpPortal
 - Raydium pool creation (CPMM, CLMM, AMMv4)
 - Orca Whirlpool integration
 - Manifest market creation, and limit orders
 - Meteora Dynamic AMM, DLMM Pool, and Alpha Vault
 - Openbook market creation
 - Register and Resolve SNS
 - Jito Bundles
 - Pyth Price feeds for fetching Asset Prices
 - Register/resolve Alldomains
 - Perpetuals Trading with Adrena Protocol
 - Drift Vaults, Perps, Lending and Borrowing
 - Cross-chain bridging via deBridge DLN
 - Cross chain bridging via Wormhole
 
 - 
Solana Blinks
- Lending by Lulo (Best APR for USDC)
 - Send Arcade Games
 - JupSOL staking
 - Solayer SOL (sSOL)staking
 
 - 
Non-Financial Actions
- Gib Work for registering bounties
 
 - 
Market Data Integration
- CoinGecko Pro API integration
 - Real-time token price data
 - Trending tokens and pools
 - Top gainers analysis
 - Token information lookup
 - Latest pool tracking
 
 
- 
LangChain Integration
- Ready-to-use LangChain tools for blockchain operations
 - Autonomous agent support with React framework
 - Memory management for persistent interactions
 - Streaming responses for real-time feedback
 
 - 
Vercel AI SDK Integration
- Vercel AI SDK for AI agent integration
 - Framework agnostic support
 - Quick and easy toolkit setup
 
 - 
Autonomous Modes
- Interactive chat mode for guided operations
 - Autonomous mode for independent agent actions
 - Configurable action intervals
 - Built-in error handling and recovery
 
 - 
AI Tools
- DALL-E integration for NFT artwork generation
 - Natural language processing for blockchain commands
 - Price feed integration for market analysis
 - Automated decision-making capabilities
 
 
You can view the full documentation of the kit at docs.sendai.fun
The Solana Agent Kit V2 is a major upgrade from V1, to learn why check out our migration guide
npm install solana-agent-kitYou can choose to install any of the plugins listed below or you could choose to install all of them to experience the full power of the Solana Agent Kit.
- Token plugin (
@solana-agent-kit/plugin-token): Token operations for SPL tokens such as transferring assets, swapping, bridging, and rug checking. - NFT plugin (
@solana-agent-kit/plugin-nft): NFT operations for Metaplex NFTs such as minting, listing, and metadata management. - DeFi plugin (
@solana-agent-kit/plugin-defi): DeFi operations for Solana protocols such as staking, lending, borrowing, and spot and perpetual trading. - Misc plugin (
@solana-agent-kit/plugin-misc): Miscellaneous operations such as airdrops, price feeds, coingecko token information, and domain registration. - Blinks plugin (
@solana-agent-kit/plugin-blinks): Blinks operations for Solana protocols such as arcade games and more soon to come. 
npm install @solana-agent-kit/plugin-token @solana-agent-kit/plugin-nft @solana-agent-kit/plugin-defi @solana-agent-kit/plugin-misc @solana-agent-kit/plugin-blinksInitializing the wallet interface and agent with plugins:
import { SolanaAgentKit, createVercelAITools, KeypairWallet } from "solana-agent-kit"; // or import createLangchainTools if using langchain or createOpenAITools for OpenAI agents
import TokenPlugin from "@solana-agent-kit/plugin-token";
import NFTPlugin from "@solana-agent-kit/plugin-nft";
import DefiPlugin from "@solana-agent-kit/plugin-defi";
import MiscPlugin from "@solana-agent-kit/plugin-misc";
import BlinksPlugin from "@solana-agent-kit/plugin-blinks";
const keyPair = Keypair.fromSecretKey(bs58.decode("YOUR_SECRET_KEY"))
const wallet = new KeypairWallet(keyPair)
// Initialize with private key and optional RPC URL
const agent = new SolanaAgentKit(
  wallet,
  "YOUR_RPC_URL",
  {
    OPENAI_API_KEY: "YOUR_OPENAI_API_KEY",
  }
) // Add the plugins you would like to use
  .use(TokenPlugin)
  .use(NFTPlugin)
  .use(DefiPlugin)
  .use(MiscPlugin)
  .use(BlinksPlugin);
// Create LangChain tools
const tools = createVercelAITools(agent, agent.actions);You can also make use of the wallet interface provided by the Solana wallet adapter for embedded wallets.
const result = await agent.methods.deployToken(
  agent,
  "my ai token", // name
  "uri", // uri
  "token", // symbol
  9, // decimals
  {
    mintAuthority: null, // by default, deployer account
    freezeAuthority: null, // by default, deployer account
    updateAuthority: undefined, // by default, deployer account
    isMutable: false // by default, true
  },
  1000000 // initial supply
);
console.log("Token Mint Address:", result.mint.toString());const result = await agent.methods.deployToken2022(
  "my ai token 2022", // name
  "uri", // uri
  "token2022", // symbol
  9, // decimals
  {
    mintAuthority: null, // by default, deployer account
    freezeAuthority: null, // by default, deployer account
    updateAuthority: undefined, // by default, deployer account
    isMutable: false // by default, true
  },
  1000000 // initial supply
);
console.log("Token2022 Mint Address:", result.mint.toString());const isDevnet = false; // (Optional) if not present TX takes place in Mainnet
const priorityFeeParam = 1000000; // (Optional) if not present the default priority fee will be 50000
 const collectionOpts: CreateCollectionOptions = {
    collectionName: "",
    collectionSymbol: "",
    collectionDescription: "",
    mainImageUrl: ""
  };
const result = await agent.methods.create3LandCollection(
      collectionOpts,
      isDevnet, // (Optional) if not present TX takes place in Mainnet
      priorityFeeParam, //(Optional)
    );When creating an NFT using 3Land's tool, it automatically goes for sale on 3.land website
const isDevnet = true; // (Optional) if not present TX takes place in Mainnet
const withPool = true; // (Optional) only present if NFT will be created with a Liquidity Pool for a specific SPL token
const priorityFeeParam = 1000000; // (Optional) if not present the default priority fee will be 50000
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
  splHash: "", //present if listing is on a specific SPL token, if not present sale will be on $SOL, must be present if "withPool" is true
  poolName: "", // Only present if "withPool" is true
  mainImageUrl: "",
};
const result = await agent.methods.create3LandSingle(
  {},
  collectionAccount,
  createItemOptions,
  isDevnet, // (Optional) if not present TX takes place in Mainnet
  withPool
  priorityFeeParam, //(Optional)
);const collection = await agent.methods.deployCollection(agent, {
  name: "My NFT Collection",
  uri: "https://arweave.net/metadata.json",
  royaltyBasisPoints: 500, // 5%
  creators: [
    {
      address: "creator-wallet-address",
      percentage: 100,
    },
  ],
});import { PublicKey } from "@solana/web3.js";
const signature = await agent.methods.trade(
  agent,
  new PublicKey("target-token-mint"),
  100, // amount
  new PublicKey("source-token-mint"),
  300 // 3% slippage
);import { PublicKey } from "@solana/web3.js";
const signature = await agent.methods.lendAssets(
  agent,
  100 // amount of USDC to lend
);const signature = await agent.methods.stakeWithJup(
  agent,
  1 // amount in SOL to stake
);const signature = await agent.methods.stakeWithSolayer(
  agent,
  1 // amount in SOL to stake
);import { PublicKey } from "@solana/web3.js";
(async () => {
  console.log(
    "~Airdrop cost estimate:",
    getAirdropCostEstimate(
      1000, // recipients
      30_000 // priority fee in lamports
    )
  );
  const signature = await agent.methods.sendCompressedAirdrop(
    agent,
    new PublicKey("JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"), // mint
    42, // amount per recipient
    9,
    [
      new PublicKey("1nc1nerator11111111111111111111111111111111"),
      // ... add more recipients
    ],
    30_000 // priority fee in lamports
  );
})();const priceFeedID = await agent.methods.fetchPythPriceFeedID("SOL");
const price = await agent.methods.fetchPythPrice(priceFeedID);
console.log("Price of SOL/USD:", price);import { PublicKey } from "@solana/web3.js";
const signature = await agent.methods.openPerpTradeLong({
  agent: agent,
  price: 300, // $300 SOL Max price
  collateralAmount: 10, // 10 jitoSOL in
  collateralMint: new PublicKey("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"), // jitoSOL
  leverage: 50000, // x5
  tradeMint: new PublicKey("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"), // jitoSOL
  slippage: 0.3, // 0.3%
});import { PublicKey } from "@solana/web3.js";
const signature = await agent.methods.closePerpTradeLong({
  agent: agent,
  price: 200, // $200 SOL price
  tradeMint: new PublicKey("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"), // jitoSOL
});const { signature } = await agent.methods.closeEmptyTokenAccounts(agent);Create a drift account with an initial token deposit.
const result = await agent.methods.createDriftUserAccount(
  agent,
  // amount of token to deposit
  100,
  // token symbol to deposit
  "USDC"
)Create a drift vault.
const signature = await agent.methods.createDriftVault(agent, {
  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.methods.depositIntoDriftVault(agent, 100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")Deposit tokens into your drift account.
const {txSig} = await agent.methods.depositToDriftUserAccount(agent, 100, "USDC")Derive a drift vault address.
const vaultPublicKey = await agent.methods.deriveDriftVaultAddress(agent, "my-drift-vault")Check if agent has a drift account.
const {hasAccount, account} = await agent.methods.doesUserHaveDriftAccount(agent)Get drift account information.
const accountInfo = await agent.methods.driftUserAccountInfo(agent)Request withdrawal from drift vault.
const signature = await agent.methods.requestWithdrawalFromDriftVault(agent, 100, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")Open a perpetual trade using a drift vault that is delegated to you.
const signature = await agent.methods.tradeUsingDelegatedDriftVault(agent, {
  vault: "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU",
  amount: 500,
  symbol: "SOL",
  action: "long",
  type: "limit",
  price: 180 // Please long limit order at $180/SOL
})Open a perpetual trade using your drift account.
const signature = await agent.methods.driftPerpTrade(agent, {
  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.methods.updateDriftVault(agent, {
  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.methods.withdrawFromDriftUserAccount(agent, 100, "USDC")Borrow tokens from drift.
const {txSig} = await agent.methods.withdrawFromDriftUserAccount(agent, 1, "SOL", true)Repay a loan from drift.
const {txSig} = await agent.methods.depositToDriftUserAccount(agent, 1, "SOL", true)Withdraw tokens from a drift vault after the redemption period has elapsed.
const signature = await agent.methods.withdrawFromDriftVault(agent,  "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")Update the address a drift vault is delegated to.
const signature = await agent.methods.updateDriftVaultDelegate(agent, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", "new-address")Get the current position values and total value of assets in a Voltr vault.
const values = await agent.methods.voltrGetPositionValues(agent, "7opUkqYtxmQRriZvwZkPcg6LqmGjAh1RSEsVrdsGDx5K")Deposit assets into a specific strategy within a Voltr vault.
const signature = await agent.methods.voltrDepositStrategy(
  agent,
  new BN("1000000000"), // amount in base units (e.g., 1 USDC = 1000000)
  "7opUkqYtxmQRriZvwZkPcg6LqmGjAh1RSEsVrdsGDx5K", // vault
  "9ZQQYvr4x7AMqd6abVa1f5duGjti5wk1MHsX6hogPsLk"  // strategy
)Withdraw assets from a specific strategy within a Voltr vault.
const signature = await agent.methods.voltrWithdrawStrategy(
  agent,
  new BN("1000000000"), // amount in base units (e.g., 1 USDC = 1000000)
  "7opUkqYtxmQRriZvwZkPcg6LqmGjAh1RSEsVrdsGDx5K", // vault
  "9ZQQYvr4x7AMqd6abVa1f5duGjti5wk1MHsX6hogPsLk"  // strategy
)const asset = await agent.methods.getAsset(agent, "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU")Get the price for a given token and timeframe from Allora's API
const sol5mPrice = await agent.methods.getPriceInference("SOL", "5m");
console.log("5m price inference of SOL/USD:", sol5mPrice);const topics = await agent.methods.getAllTopics();
console.log("Allora topics:", topics);const inference = await agent.methods.getInferenceByTopicId(42);
console.log("Allora inference for topic 42:", inference);Simulate a given Switchboard feed. Find or create feeds here.
const value = await agent.methods.simulateSwitchboardFeed(
      "9wcBMATS8bGLQ2UcRuYjsRAD7TPqB1CMhqfueBx78Uj2", // TRUMP/USD
      "http://crossbar.switchboard.xyz");;
console.log("Simulation resulted in the following value:", value);
### Cross-Chain Bridge via deBridge
The Solana Agent Kit supports cross-chain token transfers using deBridge's DLN protocol. Here's how to use it:
1. Check supported chains:
```typescript
const chains = await agent.methods.getDebridgeSupportedChains();
console.log("Available chains:", chains);
// Example output: { chains: [{ chainId: "1", chainName: "Ethereum" }, { chainId: "7565164", chainName: "Solana" }] }- Get available tokens (optional):
 
const tokens = await agent.methods.getDebridgeTokensInfo("1", "USDC"); // Search for USDC on Ethereum
console.log("Available tokens:", tokens);
// Shows tokens matching 'USDC' on the specified chain- Create bridge order (SOL -> ETH):
 
const orderInput = {
  srcChainId: "7565164", // Solana
  srcChainTokenIn: "11111111111111111111111111111111", // Native SOL
  srcChainTokenInAmount: "1000000000", // 1 SOL (9 decimals)
  dstChainId: "1", // Ethereum
  dstChainTokenOut: "0x0000000000000000000000000000000000000000", // ETH
  dstChainTokenOutRecipient: "0x23C279e58ddF1018C3B9D0C224534fA2a83fb1d2" // ETH recipient
};
const order = await agent.methods.createDebridgeOrder(orderInput);
console.log("Order created:", order);
// Contains transaction data and estimated amounts- Execute the bridge order:
 
const signature = await agent.methods.executeDebridgeOrder(order.tx.data);
console.log("Bridge transaction sent:", signature);- Check bridge status:
 
const status = await agent.methods.checkDebridgeTransactionStatus(signature);
console.log("Bridge status:", status);
// Shows current status: Created, Fulfilled, etc.Note: When bridging between chains:
- To Solana: Use base58 addresses for recipients and token mints
 - From Solana: Use EVM addresses for recipients and ERC-20 format for tokens
 - Always verify addresses and amounts before executing bridge transactions
 
const priceData = await agent.methods.getTokenPriceData([
  "So11111111111111111111111111111111111111112", // SOL
  "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"  // USDC
]);
console.log("Token prices:", priceData);const trendingTokens = await agent.methods.getTrendingTokens();
console.log("Trending tokens:", trendingTokens);const latestPools = await agent.methods.getLatestPools();
console.log("Latest pools:", latestPools);const tokenInfo = await agent.methods.getTokenInfo("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
console.log("Token info:", tokenInfo);const topGainers = await agent.methods.getTopGainers("24h", "all");
console.log("Top gainers:", topGainers);const trendingPools = await agent.methods.getTrendingPools("24h");
console.log("Trending pools:", trendingPools);const parsedData = await agent.methods.parseInstruction(
  "<programId>",
  "<instructionData>" // base64
)
console.log("parsed data:", parsedData)const parsedData = await agent.methods.parseAccount(
  "<programId>",
  "<accountData>" // base64
)
console.log("parsed data:", parsedData)const prices = await agent.methods.getSanctumLSTPrice([
  "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",
  "7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn"
  ])
console.log('prices', prices)const apys = await agent.methods.getSanctumLSTAPY([
  "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",
  "7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn"
  ])
console.log('apys', apys)const tvls = await agent.methods.getSanctumLSTTVL([
  "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",
  "7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn"
  ])
console.log('tvls', tvls)const lsts = await agent.methods.getSanctumOwnedLST()
console.log('lsts', lsts)const txId = await agent.methods.addSanctumLiquidity(
  "So11111111111111111111111111111111111111112",
  "1000000000",
  "1100000000",
  5000
)
console.log('txId', txId)const txId = await agent.methods.removeSanctumLiquidity(
  "So11111111111111111111111111111111111111112",
  "1000000000",
  "1100000000",
  5000
)
console.log('txId', txId)const txId = await agent.methods.swapSanctumLST(
  "So11111111111111111111111111111111111111112",
  "1000000000",
  "1100000000",
  5000,
  "7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn"
)
console.log('txId', txId)Note: To use OKX DEX integration, you need to set up the following environment variables: Get OKX API keys from the [OKX Developer Portal] (https://www.okx.com/web3/build/dev-portal)
OKX_API_KEYOKX_SECRET_KEYOKX_API_PASSPHRASEOKX_PROJECT_IDRPC_URLSOLANA_PRIVATE_KEYSOLANA_WALLET_ADDRESS
The repository includes an advanced example of building a multi-agent system using LangGraph and Solana Agent Kit. Located in examples/agent-kit-langgraph, this example demonstrates:
- Multi-agent architecture using LangGraph's StateGraph
 - Specialized agents for different tasks:
- General purpose agent for basic queries
 - Transfer/Swap agent for transaction operations
 - Read agent for blockchain data queries
 - Manager agent for routing and orchestration
 
 - Fully typed TypeScript implementation
 - Environment-based configuration
 
Check out the LangGraph example for a complete implementation of an advanced Solana agent system.
The toolkit relies on several key Solana and Metaplex libraries:
- @solana/web3.js
 - @solana/spl-token
 - @metaplex-foundation/digital-asset-standard-api
 - @metaplex-foundation/mpl-token-metadata
 - @metaplex-foundation/mpl-core
 - @metaplex-foundation/umi
 - @lightprotocol/compressed-token
 - @lightprotocol/stateless.js
 - @coingecko/sdk
 
Contributions are welcome! Please feel free to submit a Pull Request. Refer to CONTRIBUTING.md for detailed guidelines on how to contribute to this project.
Apache-2 License
If you wanna give back any tokens or donations to the OSS community -- The Public Solana Agent Kit Treasury Address:
Solana Network : EKHTbXpsm6YDgJzMkFxNU1LNXeWcUW7Ezf8mjUNQQ4Pa
This toolkit handles transaction generation, signing and sending, using provided wallets. Always ensure you're using it in a secure environment and never share your private keys.
System prompt logic adapted from Coinbase AgentKit (Apache 2.0)
