From 2c4ea0519d7fdd0bd32a0ba1c9b260a04ccffc0c Mon Sep 17 00:00:00 2001 From: edgar sarkisian Date: Mon, 27 Jan 2025 18:43:49 -0500 Subject: [PATCH 1/6] add switchboard feature --- package.json | 1 + pnpm-lock.yaml | 11 ++-- src/actions/index.ts | 2 + src/actions/switchboard/simulate_feed.ts | 63 +++++++++++++++++++ src/agent/index.ts | 8 +++ src/constants/index.ts | 6 ++ src/langchain/index.ts | 3 + src/langchain/switchboard/index.ts | 1 + .../switchboard/switchboard_simulate_feed.ts | 47 ++++++++++++++ src/tools/index.ts | 1 + src/tools/switchboard/index.ts | 1 + src/tools/switchboard/simulate_feed.ts | 35 +++++++++++ src/types/index.ts | 8 +++ test/tools/switchboard.ts | 49 +++++++++++++++ 14 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 src/actions/switchboard/simulate_feed.ts create mode 100644 src/langchain/switchboard/index.ts create mode 100644 src/langchain/switchboard/switchboard_simulate_feed.ts create mode 100644 src/tools/switchboard/index.ts create mode 100644 src/tools/switchboard/simulate_feed.ts create mode 100644 test/tools/switchboard.ts diff --git a/package.json b/package.json index 2839083f..9ab5cc9a 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@solana/spl-token": "^0.4.9", "@solana/web3.js": "^1.98.0", "@sqds/multisig": "^2.1.3", + "@switchboard-xyz/common": "^2.5.15", "@tensor-oss/tensorswap-sdk": "^4.5.0", "@tiplink/api": "^0.3.1", "@voltr/vault-sdk": "^0.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06c844bb..dfbd51dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,6 +101,9 @@ importers: '@sqds/multisig': specifier: ^2.1.3 version: 2.1.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@switchboard-xyz/common': + specifier: ^2.5.15 + version: 2.5.15(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@tensor-oss/tensorswap-sdk': specifier: ^4.5.0 version: 4.5.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) @@ -1475,8 +1478,8 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@switchboard-xyz/common@2.5.12': - resolution: {integrity: sha512-D10cYwo0nMk8Y/jiz8hhyN0yhDIohdpXURVRF7E+co8qQ5a4kqs38yIKQFLkCyY4xlKHdTFNl91wWm2B8ZKCCg==} + '@switchboard-xyz/common@2.5.15': + resolution: {integrity: sha512-W4ub5Na0pf+OIBp8a8JhHzDIqleNI8iClNE5SeQeAMeElzT99fzfEXlY0gVXA7tXOrsLer9I383dCku0H7TDEw==} engines: {node: '>=12'} '@switchboard-xyz/on-demand@1.2.42': @@ -7749,7 +7752,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@switchboard-xyz/common@2.5.12(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@switchboard-xyz/common@2.5.15(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) axios: 1.7.9 @@ -7774,7 +7777,7 @@ snapshots: '@coral-xyz/anchor-30': '@coral-xyz/anchor@0.30.1(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) '@solworks/soltoolkit-sdk': 0.0.23(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) - '@switchboard-xyz/common': 2.5.12(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@switchboard-xyz/common': 2.5.15(bufferutil@4.0.9)(utf-8-validate@5.0.10) axios: 1.7.9 big.js: 6.2.2 bs58: 5.0.0 diff --git a/src/actions/index.ts b/src/actions/index.ts index 0bd0b467..370de99d 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -76,6 +76,7 @@ import getAssetAction from "./metaplex/getAsset"; import getAssetsByAuthorityAction from "./metaplex/getAssetsByAuthority"; import getAssetsByCreatorAction from "./metaplex/getAssetsByCreator"; import getInfoAction from "./agent/get_info"; +import switchboardSimulateFeedAction from "./switchboard/simulate_feed"; export const ACTIONS = { GET_INFO_ACTION: getInfoAction, @@ -157,6 +158,7 @@ export const ACTIONS = { WITHDRAW_VOLTR_STRATEGY_ACTION: withdrawVoltrStrategyAction, GET_ASSET_ACTION: getAssetAction, GET_ASSETS_BY_AUTHORITY_ACTION: getAssetsByAuthorityAction, + SWITCHBOARD_FEED_ACTION: switchboardSimulateFeedAction, GET_ASSETS_BY_CREATOR_ACTION: getAssetsByCreatorAction, }; diff --git a/src/actions/switchboard/simulate_feed.ts b/src/actions/switchboard/simulate_feed.ts new file mode 100644 index 00000000..45730cd0 --- /dev/null +++ b/src/actions/switchboard/simulate_feed.ts @@ -0,0 +1,63 @@ +import { Action } from "../../types/action"; +import { SolanaAgentKit } from "../../agent"; +import { z } from "zod"; +import { simulate_switchboard_feed } from "../../tools"; +import { SWITCHBOARD_DEFAULT_CROSSBAR } from "../../constants"; + +const switchboardSimulateFeedAction: Action = { + name: "SWITCHBOARD_SIMULATE_FEED", + similes: [ + "simulate switchboard price feed", + "simulate switchboard feed", + "switchboard oracle feed", + "get switchboard price", + "check switchboard price", + "switchboard price", + "switchbaord feed", + ], + description: + "Simulates a given switchboard price feed and returns the value.", + examples: [ + [ + { + input: { + feed: "6qmsMwtMmeqMgZEhyLv1Pe4wcqT5iKwJAWnmzmnKjf83", // BTC/USDT price feed + }, + output: { + status: "success", + value: "104097.59", + message: "Current price in USDT: $104,097.59", + }, + explanation: + "Get the current BTC/USDT price by simulating a Switchbaord feed", + }, + ], + ], + schema: z.object({ + feedAddress: z + .string() + .describe("The address of the Switchboard feed to simulate"), + crossbarUrl: z + .string() + .default(SWITCHBOARD_DEFAULT_CROSSBAR) + .describe("The url of the crossbar server to use"), + }), + handler: async (agent: SolanaAgentKit, input: Record) => { + try { + const { feedAddress, crossbarUrl } = input; + const result = await simulate_switchboard_feed(feedAddress, crossbarUrl); + return { + status: "success", + feed: feedAddress, + message: `Simulation result: ${result}`, + }; + } catch (error: any) { + return { + status: "error", + message: `Failed to simulate Switchboard feed: ${error.message}`, + }; + } + }, +}; + +export default switchboardSimulateFeedAction; diff --git a/src/agent/index.ts b/src/agent/index.ts index 5bbc8458..b1257235 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -117,6 +117,7 @@ import { get_asset, get_assets_by_authority, get_assets_by_creator, + simulate_switchboard_feed, } from "../tools"; import { Config, @@ -1022,4 +1023,11 @@ export class SolanaAgentKit { ): Promise { return get_assets_by_creator(this, params); } + + async simulateSwitchboardFeed( + feed: PublicKey, + crossbarUrl: string, + ): Promise { + return simulate_switchboard_feed(this, feed, crossbarUrl); + } } diff --git a/src/constants/index.ts b/src/constants/index.ts index 472213fd..a961e611 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -47,3 +47,9 @@ export const METEORA_DLMM_PROGRAM_ID = new PublicKey( */ export const MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS = 0.000003 * 1000000 * 1000000; + +/** + * Switchboard public crossbar instance. + * https://docs.switchboard.xyz/docs/switchboard/crossbar-and-task-runner + */ +export const SWITCHBOARD_DEFAULT_CROSSBAR = "https://crossbar.switchboard.xyz"; diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 107da3e6..55aa94c3 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -28,6 +28,7 @@ export * from "./meteora"; export * from "./helius"; export * from "./drift"; export * from "./voltr"; +export * from "./switchboard"; import type { SolanaAgentKit } from "../agent"; import { @@ -134,6 +135,7 @@ import { SolanaGetAssetsByAuthorityTool, SolanaGetAssetsByCreatorTool, SolanaGetInfoTool, + SolanaSwitchboardSimulateFeed, } from "./index"; export function createSolanaTools(solanaKit: SolanaAgentKit) { @@ -246,5 +248,6 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaGetAssetTool(solanaKit), new SolanaGetAssetsByAuthorityTool(solanaKit), new SolanaGetAssetsByCreatorTool(solanaKit), + new SolanaSwitchboardSimulateFeed(solanaKit), ]; } diff --git a/src/langchain/switchboard/index.ts b/src/langchain/switchboard/index.ts new file mode 100644 index 00000000..557d10ca --- /dev/null +++ b/src/langchain/switchboard/index.ts @@ -0,0 +1 @@ +export * from "./switchboard_simulate_feed"; diff --git a/src/langchain/switchboard/switchboard_simulate_feed.ts b/src/langchain/switchboard/switchboard_simulate_feed.ts new file mode 100644 index 00000000..1313daca --- /dev/null +++ b/src/langchain/switchboard/switchboard_simulate_feed.ts @@ -0,0 +1,47 @@ +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../../agent"; +import { SwitchboardSimulateFeedResponse } from "../../index"; +import { PublicKey } from "@solana/web3.js"; + +export class SolanaSwitchboardSimulateFeed extends Tool { + name = "switchboard_simulate_feed"; + description = `Simluates a Switchboard price feed given the feed's public key. + Input should be a JSON string with the following format: + { + "feed": string (required) - the public key (a.k.a. feed hash) of the feed to simulate + "crossbarUrl": string (optional) - the url of the crossbar instance to use. Defaults to "https://crossbar.switchboard.xyz" + } + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + async _call(input: string): Promise { + try { + const InputFormat = JSON.parse(input); + const feed = new PublicKey(InputFormat.feed); + const crossbarUrl = InputFormat.crossbarUrl; + + const value = await this.solanaKit.simulateSwitchboardFeed( + feed, + crossbarUrl, + ); + + const response: SwitchboardSimulateFeedResponse = { + status: "success", + feed, + value: Number.parseInt(value), + }; + + return JSON.stringify(response); + } catch (error: any) { + const response: SwitchboardSimulateFeedResponse = { + status: "error", + message: error.message, + code: error.code, + }; + return JSON.stringify(response); + } + } +} diff --git a/src/tools/index.ts b/src/tools/index.ts index d7aa8791..e66d2d5c 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -27,3 +27,4 @@ export * from "./squads"; export * from "./meteora"; export * from "./helius"; export * from "./voltr"; +export * from "./switchboard"; diff --git a/src/tools/switchboard/index.ts b/src/tools/switchboard/index.ts new file mode 100644 index 00000000..056e4dfb --- /dev/null +++ b/src/tools/switchboard/index.ts @@ -0,0 +1 @@ +export * from "./simulate_feed"; diff --git a/src/tools/switchboard/simulate_feed.ts b/src/tools/switchboard/simulate_feed.ts new file mode 100644 index 00000000..0b528225 --- /dev/null +++ b/src/tools/switchboard/simulate_feed.ts @@ -0,0 +1,35 @@ +import { SolanaAgentKit } from "../../index"; +import { PublicKey } from "@solana/web3.js"; +import { SWITCHBOARD_DEFAULT_CROSSBAR } from "../../constants"; +import { CrossbarClient } from "@switchboard-xyz/common"; + +/** + * Simulate a switchboard feed + * @param agent SolanaAgentKit instance + * @param feed Public key of the feed to simulate as base58 + * @param crossbarUrl The url of the crossbar instance to use + * @returns Result of the simulation + */ + +export async function simulate_switchboard_feed( + agent: SolanaAgentKit, + feed: PublicKey, + crossbarUrl: string = SWITCHBOARD_DEFAULT_CROSSBAR, +): Promise { + try { + const crossbar = new CrossbarClient(crossbarUrl, true); + const results = await crossbar.simulateSolanaFeeds("mainnet", [ + feed.toString(), + ]); + + if (results.length === 0) { + throw new Error( + `Error simulating feed ${feed}. Did you provide the right mainnet feed hash?`, + ); + } + + return results[0].results.toString(); + } catch (error: any) { + throw new Error(`Error: ${error.message}`); + } +} diff --git a/src/types/index.ts b/src/types/index.ts index ed41fa05..86e191da 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -263,3 +263,11 @@ export interface PriorityFeeResponse { options: { priorityLevel: string }; }>; } + +export interface SwitchboardSimulateFeedResponse { + status: "success" | "error"; + feed?: PublicKey; + value?: number; + message?: string; + code?: string; +} diff --git a/test/tools/switchboard.ts b/test/tools/switchboard.ts new file mode 100644 index 00000000..bd51a6d1 --- /dev/null +++ b/test/tools/switchboard.ts @@ -0,0 +1,49 @@ +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../../src"; +import "dotenv/config"; + +const agent = new SolanaAgentKit( + process.env.SOLANA_PRIVATE_KEY!, + process.env.RPC_URL!, + { OPENAI_API_KEY: process.env.OPENAI_API_KEY! }, +); + +/****************************** SIMULATE A VALID FEED ******************************** */ + +(async () => { + const result = await agent.simulateSwitchboardFeed( + new PublicKey("6qmsMwtMmeqMgZEhyLv1Pe4wcqT5iKwJAWnmzmnKjf83"), // BTC/USDC + "http://crossbar.switchboard.xyz"); + + console.log("✅ BTC/USDC feed simulation result: ", result); +})(); + +(async () => { + const result = await agent.simulateSwitchboardFeed( + new PublicKey("9wcBMATS8bGLQ2UcRuYjsRAD7TPqB1CMhqfueBx78Uj2"), // TRUMP/USD + "http://crossbar.switchboard.xyz"); + + console.log("✅ TRUMP/USD feed simulation result: ", result); +})(); + +(async () => { + try { + const result = await agent.simulateSwitchboardFeed( + new PublicKey("BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB"), // Nonexistent feed + "http://crossbar.switchboard.xyz"); + console.error("❌ This call should have failed.") + process.exit(1); + } catch (error: any) { + if (error.message.includes("Did you provide the right mainnet feed hash?")) { + console.log("✅ nonexistent feed error thrown as expected"); + } + else { + console.error(error); + process.exit(1); + } + } + +})(); + + // result = await agent.simulateSwitchboardFeed(new PublicKey("BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB"), "http://crossbar.switchboard.xyz"); + // console.log(result); \ No newline at end of file From a1913a9ef2ee41c0e9929270fe31684d2824ac16 Mon Sep 17 00:00:00 2001 From: edgar sarkisian Date: Tue, 28 Jan 2025 01:34:11 -0500 Subject: [PATCH 2/6] fixed matching tool input schema --- src/actions/switchboard/simulate_feed.ts | 4 ++-- src/agent/index.ts | 2 +- src/langchain/index.ts | 4 ++-- src/langchain/switchboard/switchboard_simulate_feed.ts | 2 +- src/tools/switchboard/simulate_feed.ts | 6 ++---- src/types/index.ts | 2 +- 6 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/actions/switchboard/simulate_feed.ts b/src/actions/switchboard/simulate_feed.ts index 45730cd0..15fccdc5 100644 --- a/src/actions/switchboard/simulate_feed.ts +++ b/src/actions/switchboard/simulate_feed.ts @@ -26,7 +26,7 @@ const switchboardSimulateFeedAction: Action = { output: { status: "success", value: "104097.59", - message: "Current price in USDT: $104,097.59", + message: "Simulation result: 104097.59", }, explanation: "Get the current BTC/USDT price by simulating a Switchbaord feed", @@ -34,7 +34,7 @@ const switchboardSimulateFeedAction: Action = { ], ], schema: z.object({ - feedAddress: z + feed: z .string() .describe("The address of the Switchboard feed to simulate"), crossbarUrl: z diff --git a/src/agent/index.ts b/src/agent/index.ts index 1935701c..98b6b014 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -1048,7 +1048,7 @@ export class SolanaAgentKit { } async simulateSwitchboardFeed( - feed: PublicKey, + feed: string, crossbarUrl: string, ): Promise { return simulate_switchboard_feed(this, feed, crossbarUrl); diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 40f253b0..18a6f677 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -252,9 +252,9 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaGetAssetTool(solanaKit), new SolanaGetAssetsByAuthorityTool(solanaKit), new SolanaGetAssetsByCreatorTool(solanaKit), - new SolanaAlloraGetPriceInference(solanaKit), + new SolanaSwitchboardSimulateFeed(solanaKit), new SolanaAlloraGetAllTopics(solanaKit), new SolanaAlloraGetInferenceByTopicId(solanaKit), - new SolanaSwitchboardSimulateFeed(solanaKit), + new SolanaAlloraGetPriceInference(solanaKit), ]; } diff --git a/src/langchain/switchboard/switchboard_simulate_feed.ts b/src/langchain/switchboard/switchboard_simulate_feed.ts index 1313daca..ef656995 100644 --- a/src/langchain/switchboard/switchboard_simulate_feed.ts +++ b/src/langchain/switchboard/switchboard_simulate_feed.ts @@ -20,7 +20,7 @@ export class SolanaSwitchboardSimulateFeed extends Tool { async _call(input: string): Promise { try { const InputFormat = JSON.parse(input); - const feed = new PublicKey(InputFormat.feed); + const feed = InputFormat.feed; const crossbarUrl = InputFormat.crossbarUrl; const value = await this.solanaKit.simulateSwitchboardFeed( diff --git a/src/tools/switchboard/simulate_feed.ts b/src/tools/switchboard/simulate_feed.ts index 0b528225..55ec55e7 100644 --- a/src/tools/switchboard/simulate_feed.ts +++ b/src/tools/switchboard/simulate_feed.ts @@ -13,14 +13,12 @@ import { CrossbarClient } from "@switchboard-xyz/common"; export async function simulate_switchboard_feed( agent: SolanaAgentKit, - feed: PublicKey, + feed: string, crossbarUrl: string = SWITCHBOARD_DEFAULT_CROSSBAR, ): Promise { try { const crossbar = new CrossbarClient(crossbarUrl, true); - const results = await crossbar.simulateSolanaFeeds("mainnet", [ - feed.toString(), - ]); + const results = await crossbar.simulateSolanaFeeds("mainnet", [feed]); if (results.length === 0) { throw new Error( diff --git a/src/types/index.ts b/src/types/index.ts index bed44385..859340ee 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -294,7 +294,7 @@ export interface AlloraGetInferenceByTopicIdResponse { export interface SwitchboardSimulateFeedResponse { status: "success" | "error"; - feed?: PublicKey; + feed?: string; value?: number; message?: string; code?: string; From 58be51961868c4c429bd72bc263daf10d5276246 Mon Sep 17 00:00:00 2001 From: edgar sarkisian Date: Tue, 28 Jan 2025 02:13:33 -0500 Subject: [PATCH 3/6] added docs --- README.md | 11 +++++++++++ test/tools/switchboard.ts | 15 +++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index fe5ccd62..9d7a7e10 100644 --- a/README.md +++ b/README.md @@ -531,6 +531,17 @@ const inference = await agent.getInferenceByTopicId(42); console.log("Allora inference for topic 42:", inference); ``` +### Simulate a Switchboard feed + +Simulate a given switchboard feed. + +```typescript +const value = await agent.simulateSwitchboardFeed( + "BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB", // Nonexistent feed + "http://crossbar.switchboard.xyz");; +console.log("Simulation resulted in the following value:", value); +``` + ## Examples ### LangGraph Multi-Agent System diff --git a/test/tools/switchboard.ts b/test/tools/switchboard.ts index bd51a6d1..1c0108a4 100644 --- a/test/tools/switchboard.ts +++ b/test/tools/switchboard.ts @@ -12,7 +12,7 @@ const agent = new SolanaAgentKit( (async () => { const result = await agent.simulateSwitchboardFeed( - new PublicKey("6qmsMwtMmeqMgZEhyLv1Pe4wcqT5iKwJAWnmzmnKjf83"), // BTC/USDC + "6qmsMwtMmeqMgZEhyLv1Pe4wcqT5iKwJAWnmzmnKjf83", // BTC/USDC "http://crossbar.switchboard.xyz"); console.log("✅ BTC/USDC feed simulation result: ", result); @@ -20,16 +20,18 @@ const agent = new SolanaAgentKit( (async () => { const result = await agent.simulateSwitchboardFeed( - new PublicKey("9wcBMATS8bGLQ2UcRuYjsRAD7TPqB1CMhqfueBx78Uj2"), // TRUMP/USD + "9wcBMATS8bGLQ2UcRuYjsRAD7TPqB1CMhqfueBx78Uj2", // TRUMP/USD "http://crossbar.switchboard.xyz"); console.log("✅ TRUMP/USD feed simulation result: ", result); })(); - + +/**************************** SIMULATE AN INVALID FEED ******************************* */ + (async () => { try { const result = await agent.simulateSwitchboardFeed( - new PublicKey("BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB"), // Nonexistent feed + "BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB", // Nonexistent feed "http://crossbar.switchboard.xyz"); console.error("❌ This call should have failed.") process.exit(1); @@ -43,7 +45,4 @@ const agent = new SolanaAgentKit( } } -})(); - - // result = await agent.simulateSwitchboardFeed(new PublicKey("BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB"), "http://crossbar.switchboard.xyz"); - // console.log(result); \ No newline at end of file +})(); \ No newline at end of file From 7c710ced1e2d6a195efbcaf07d51650ecde4362d Mon Sep 17 00:00:00 2001 From: edgar sarkisian Date: Tue, 28 Jan 2025 02:17:49 -0500 Subject: [PATCH 4/6] fixed docs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9d7a7e10..4156248f 100644 --- a/README.md +++ b/README.md @@ -533,11 +533,11 @@ console.log("Allora inference for topic 42:", inference); ### Simulate a Switchboard feed -Simulate a given switchboard feed. +Simulate a given Switchboard feed. Find or create feeds [here](https://ondemand.switchboard.xyz/solana/mainnet). ```typescript const value = await agent.simulateSwitchboardFeed( - "BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB", // Nonexistent feed + "9wcBMATS8bGLQ2UcRuYjsRAD7TPqB1CMhqfueBx78Uj2", // TRUMP/USD "http://crossbar.switchboard.xyz");; console.log("Simulation resulted in the following value:", value); ``` From 456c0a454920d7f3f285792340bed1a04f3e6daf Mon Sep 17 00:00:00 2001 From: edgar sarkisian Date: Tue, 28 Jan 2025 14:34:23 -0500 Subject: [PATCH 5/6] removed sb test file --- test/tools/switchboard.ts | 48 --------------------------------------- 1 file changed, 48 deletions(-) delete mode 100644 test/tools/switchboard.ts diff --git a/test/tools/switchboard.ts b/test/tools/switchboard.ts deleted file mode 100644 index 1c0108a4..00000000 --- a/test/tools/switchboard.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { PublicKey } from "@solana/web3.js"; -import { SolanaAgentKit } from "../../src"; -import "dotenv/config"; - -const agent = new SolanaAgentKit( - process.env.SOLANA_PRIVATE_KEY!, - process.env.RPC_URL!, - { OPENAI_API_KEY: process.env.OPENAI_API_KEY! }, -); - -/****************************** SIMULATE A VALID FEED ******************************** */ - -(async () => { - const result = await agent.simulateSwitchboardFeed( - "6qmsMwtMmeqMgZEhyLv1Pe4wcqT5iKwJAWnmzmnKjf83", // BTC/USDC - "http://crossbar.switchboard.xyz"); - - console.log("✅ BTC/USDC feed simulation result: ", result); -})(); - -(async () => { - const result = await agent.simulateSwitchboardFeed( - "9wcBMATS8bGLQ2UcRuYjsRAD7TPqB1CMhqfueBx78Uj2", // TRUMP/USD - "http://crossbar.switchboard.xyz"); - - console.log("✅ TRUMP/USD feed simulation result: ", result); -})(); - -/**************************** SIMULATE AN INVALID FEED ******************************* */ - -(async () => { - try { - const result = await agent.simulateSwitchboardFeed( - "BwBLNEuTnqQVhzgx3557szSgz1PEHEvj2RRoPiFWR8YB", // Nonexistent feed - "http://crossbar.switchboard.xyz"); - console.error("❌ This call should have failed.") - process.exit(1); - } catch (error: any) { - if (error.message.includes("Did you provide the right mainnet feed hash?")) { - console.log("✅ nonexistent feed error thrown as expected"); - } - else { - console.error(error); - process.exit(1); - } - } - -})(); \ No newline at end of file From 08dbf65f3506d57445e777996d51b2f2bf5f639c Mon Sep 17 00:00:00 2001 From: edgar sarkisian Date: Wed, 29 Jan 2025 09:08:06 -0500 Subject: [PATCH 6/6] removed unnecessary imports --- src/langchain/switchboard/switchboard_simulate_feed.ts | 1 - src/tools/switchboard/simulate_feed.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/langchain/switchboard/switchboard_simulate_feed.ts b/src/langchain/switchboard/switchboard_simulate_feed.ts index ef656995..25e00c9b 100644 --- a/src/langchain/switchboard/switchboard_simulate_feed.ts +++ b/src/langchain/switchboard/switchboard_simulate_feed.ts @@ -1,7 +1,6 @@ import { Tool } from "langchain/tools"; import { SolanaAgentKit } from "../../agent"; import { SwitchboardSimulateFeedResponse } from "../../index"; -import { PublicKey } from "@solana/web3.js"; export class SolanaSwitchboardSimulateFeed extends Tool { name = "switchboard_simulate_feed"; diff --git a/src/tools/switchboard/simulate_feed.ts b/src/tools/switchboard/simulate_feed.ts index 55ec55e7..19b967d3 100644 --- a/src/tools/switchboard/simulate_feed.ts +++ b/src/tools/switchboard/simulate_feed.ts @@ -1,5 +1,4 @@ import { SolanaAgentKit } from "../../index"; -import { PublicKey } from "@solana/web3.js"; import { SWITCHBOARD_DEFAULT_CROSSBAR } from "../../constants"; import { CrossbarClient } from "@switchboard-xyz/common";