Solana Agent Kit provides integration with Switchboard for simulating oracle price feeds. This integration allows you to fetch simulated price data for any Switchboard feed on mainnet.

Key Features

  • Price feed simulation
  • Customizable Crossbar endpoint
  • Mainnet feed support
  • LangChain tool integration
  • Error handling and validation

Basic Usage

Simulating a Price Feed

const result = await agent.simulateSwitchboardFeed(
  "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR",  // Feed public key
  "https://crossbar.switchboard.xyz"                 // Optional Crossbar URL
);

Input Parameters

Feed Simulation Parameters

interface SimulateFeedParams {
  feed: string;           // Feed public key (hash)
  crossbarUrl?: string;   // Optional Crossbar URL
}

Response Type

interface SwitchboardSimulateFeedResponse {
  status: "success" | "error";
  feed?: string;          // Feed public key
  value?: number;         // Simulated feed value
  message?: string;       // Error message if status is "error"
  code?: string;          // Error code if status is "error"
}

LangChain Integration

Solana Agent Kit provides a LangChain tool for feed simulation:

Simulate Feed Tool

import { SolanaSwitchboardSimulateFeed } from 'solana-agent-kit';

const simulateFeedTool = new SolanaSwitchboardSimulateFeed(agent);

// Tool input format (JSON string):
const input = JSON.stringify({
  feed: "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR",
  crossbarUrl: "https://crossbar.switchboard.xyz"  // Optional
});

// Tool returns JSON response:
{
  status: "success",
  feed: "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR",
  value: 1234567
}

Example Prompts

For LangChain AI tools, here are example prompts:

Feed Simulation

"Simulate the SOL/USD price feed"
"Get the current BTC price from Switchboard"
"Check the ETH/USD oracle feed"

Important Notes

  1. Feed Public Keys

    • Must be valid Switchboard feed addresses
    • Only mainnet feeds are supported
    • Feed hash must be base58 encoded
  2. Crossbar Configuration

  3. Response Handling

    • Values are returned as integers
    • Empty results indicate invalid feed hash
    • Network errors are propagated

Best Practices

  1. Error Handling

    try {
      const result = await agent.simulateSwitchboardFeed(feed);
      if (!result) {
        // Handle empty result
      }
    } catch (error) {
      if (error.message.includes("feed hash")) {
        // Handle invalid feed address
      } else if (error.message.includes("network")) {
        // Handle connection issues
      }
    }
    
  2. Feed Validation

    function isValidFeedAddress(feed: string): boolean {
      try {
        return feed.length === 44 || feed.length === 43;
      } catch {
        return false;
      }
    }
    
  3. Response Processing

    // Convert response to number
    const value = Number.parseInt(result);
    if (isNaN(value)) {
      throw new Error("Invalid feed response");
    }
    

Technical Details

Constants

const SWITCHBOARD_DEFAULT_CROSSBAR = "https://crossbar.switchboard.xyz";

CrossbarClient Configuration

const crossbar = new CrossbarClient(crossbarUrl, true);  // SSL enabled

Common Feed Addresses

const FEEDS = {
  SOL_USD: "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR",
  BTC_USD: "8SXvChNYFhRq4EZuZvnhjrB3jJRQCv4k3P4W6hesH3Ee",
  ETH_USD: "HNStfhaLnqwF2ZtJUizaA9uHqgE6QK6tZkoySdJ5XoZF"
};

Network Configuration

const NETWORK_CONFIG = {
  CHAIN: "mainnet",
  MAX_RETRIES: 3,
  TIMEOUT: 5000
};

Error Messages

Common error messages and their meanings:

const ERROR_MESSAGES = {
  INVALID_FEED: "Did you provide the right mainnet feed hash?",
  EMPTY_RESULT: "No results returned from simulation",
  NETWORK_ERROR: "Failed to connect to Crossbar service"
};

Examples

  1. Basic Feed Simulation

    const value = await agent.simulateSwitchboardFeed(
      FEEDS.SOL_USD
    );
    console.log(`Current SOL price: $${value}`);
    
  2. Custom Crossbar Instance

    const value = await agent.simulateSwitchboardFeed(
      FEEDS.BTC_USD,
      "https://my-crossbar.example.com"
    );
    
  3. Error Handling

    try {
      const value = await agent.simulateSwitchboardFeed(feed);
      console.log(`Feed value: ${value}`);
    } catch (error) {
      console.error(`Simulation failed: ${error.message}`);
    }