Skip to main content

Javascript

GitHub   npm   twitter  

A library of utility functions to interact with the Switchboardv2 program

Github

View the Github repo

Install

npm install @switchboard-xyz/solana.js

Usage

Check out the @switchboard-xyz/solana.js test directory for more examples.

Load the Switchboard Program

import { Connection } from "@solana/web3.js";
import {
SwitchboardProgram,
TransactionObject,
} from "@switchboard-xyz/solana.js";

const program = await SwitchboardProgram.load(
"mainnet-beta",
new Connection("https://api.mainnet-beta.solana.com"),
payerKeypair /** Optional, READ-ONLY if not provided */
);

Create a queue

import { QueueAccount } from "@switchboard-xyz/solana.js";

const [queueAccount, txnSignature] = await QueueAccount.create(program, {
name: "My Queue",
metadata: "Top Secret",
queueSize: 100,
reward: 0.00001337,
minStake: 10,
oracleTimeout: 60,
slashingEnabled: false,
unpermissionedFeeds: true,
unpermissionedVrf: true,
enableBufferRelayers: false,
});
const queue = await queueAccount.loadData();

Add an oracle

import { QueueAccount } from "@switchboard-xyz/solana.js";

const queueAccount = new QueueAccount(program, queuePubkey);

const [oracleAccount, oracleInitSignature] = await queueAccount.createOracle({
name: "My Oracle",
metadata: "Oracle #1",
stakeAmount: 10,
});
const oracle = await oracleAccount.loadData();

await oracleAccount.heartbeat();

Add a data feed

import { QueueAccount } from "@switchboard-xyz/solana.js";

const queueAccount = new QueueAccount(program, queuePubkey);

const [aggregatorAccount, aggregatorInitSignatures] =
await queueAccount.createFeed({
batchSize: 1,
minRequiredOracleResults: 1,
minRequiredJobResults: 1,
minUpdateDelaySeconds: 60,
fundAmount: 2.5, // deposit 2.5 wSOL into the leaseAccount escrow
jobs: [
{ pubkey: jobAccount.publicKey },
{
weight: 2,
data: OracleJob.encodeDelimited(
OracleJob.fromObject({
tasks: [
{
valueTask: {
value: 1,
},
},
],
})
).finish(),
},
],
});
const aggregator = await aggregatorAccount.loadData();

Update a Data Feed

import { AggregatorAccount } from "@switchboard-xyz/solana.js";

const aggregatorAccount = new AggregatorAccount(program, aggregatorPubkey);

await aggregatorAccount.openRound();

Read a Data Feed

import Big from "big.js";
import { AggregatorAccount } from "@switchboard-xyz/solana.js";

const aggregatorAccount = new AggregatorAccount(program, aggregatorPubkey);

const result: Big | null = await aggregatorAccount.fetchLatestValue();
if (result === null) {
throw new Error("Aggregator holds no value");
}
console.log(result.toString());

History Buffer

Optionally, add a history buffer to your feed to store the last N historical samples

import {
AggregatorAccount,
AggregatorHistoryBuffer,
} from "@switchboard-xyz/solana.js";

const aggregatorAccount = new AggregatorAccount(program, aggregatorPubkey);
const aggregator = await aggregatorAccount.loadData();

const [historyBuffer, addHistorySignature] =
await AggregatorHistoryBuffer.create(program, {
aggregatorAccount,
maxSamples: 10000,
});
const history = await historyBuffer.loadData();

Watch Switchboard

Setup a websocket listener to invoke a callback whenever an aggregator is updated

import Big from "big.js";
import { AggregatorAccount } from "@switchboard-xyz/solana.js";

const aggregatorAccount = new AggregatorAccount(program, aggregatorPubkey);

const ws = aggregatorAccount.onChange((aggregator) => {
const result = AggregatorAccount.decodeLatestValue(aggregator);
if (result !== null) {
console.log(result.toString());
}
});