sbv2-utils: cleaned up loading token account for test env

wip


wip
This commit is contained in:
Conner Gallagher 2022-07-15 17:26:57 -06:00
parent d3a3645662
commit 81fe56023d
14 changed files with 219 additions and 266 deletions

View File

@ -37,7 +37,7 @@
"@project-serum/anchor": "^0.24.2", "@project-serum/anchor": "^0.24.2",
"@saberhq/token-utils": "^1.13.32", "@saberhq/token-utils": "^1.13.32",
"@solana/spl-token": "^0.2.0", "@solana/spl-token": "^0.2.0",
"@solana/web3.js": "^1.47.3", "@solana/web3.js": "^1.43.5",
"@switchboard-xyz/switchboard-v2": "^0.0.121", "@switchboard-xyz/switchboard-v2": "^0.0.121",
"big.js": "^6.1.1", "big.js": "^6.1.1",
"bn.js": "^5.2.1", "bn.js": "^5.2.1",

View File

@ -8,7 +8,7 @@ export * from "./feed.js";
export * from "./json.js"; export * from "./json.js";
export * from "./nonce.js"; export * from "./nonce.js";
export * from "./print.js"; export * from "./print.js";
export * from "./state.js";
export * from "./switchboard.js"; export * from "./switchboard.js";
export * from "./test/index.js"; export * from "./test/index.js";
export * from "./token.js";
export * from "./transaction.js"; export * from "./transaction.js";

View File

@ -1,40 +0,0 @@
import type * as anchor from "@project-serum/anchor";
import * as spl from "@solana/spl-token";
import type { PublicKey } from "@solana/web3.js";
import {
ProgramStateAccount,
programWallet,
} from "@switchboard-xyz/switchboard-v2";
export const getOrCreateSwitchboardTokenAccount = async (
program: anchor.Program,
switchboardMint?: spl.Mint,
payer = programWallet(program)
): Promise<PublicKey> => {
const getAssociatedAddress = async (mint: spl.Mint): Promise<PublicKey> => {
const tokenAccount = await spl.getOrCreateAssociatedTokenAccount(
program.provider.connection,
payer,
mint.address,
payer.publicKey,
undefined,
undefined,
undefined,
spl.TOKEN_PROGRAM_ID,
spl.ASSOCIATED_TOKEN_PROGRAM_ID
);
return tokenAccount.address;
};
let mint = switchboardMint;
if (mint) {
return getAssociatedAddress(mint);
}
const [programState] = ProgramStateAccount.fromSeed(program);
mint = await programState.getTokenMint();
if (mint) {
return getAssociatedAddress(mint);
}
throw new Error(`failed to get associated token account`);
};

View File

@ -8,6 +8,7 @@ import Big from "big.js";
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import { awaitOpenRound, createAggregator } from "../feed.js"; import { awaitOpenRound, createAggregator } from "../feed.js";
import { transferWrappedSol } from "../token.js";
export interface ISwitchboardTestContext { export interface ISwitchboardTestContext {
program: anchor.Program; program: anchor.Program;
@ -36,26 +37,61 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
this.oracle = ctx.oracle; this.oracle = ctx.oracle;
} }
// Switchboard currently uses wrapped SOL for mint /** Load the associated token wallet for the given payer with a prefunded balance
private static async createSwitchboardWallet( * @param program anchor program
* @param mint the switchboard mint address
* @param tokenAmount number of tokens to populate in switchboard mint's associated token account
*/
static async getOrCreateSwitchboardWallet(
program: anchor.Program, program: anchor.Program,
amount = 1_000_000 mint: spl.Mint,
tokenAmount: number
): Promise<PublicKey> { ): Promise<PublicKey> {
const payerKeypair = sbv2.programWallet(program); const payerKeypair = sbv2.programWallet(program);
return spl.createWrappedNativeAccount( const balance = await program.provider.connection.getBalance(
payerKeypair.publicKey
);
const associatedTokenAccount = await spl.getOrCreateAssociatedTokenAccount(
program.provider.connection, program.provider.connection,
payerKeypair, payerKeypair,
payerKeypair.publicKey, mint.address,
amount, payerKeypair.publicKey
undefined,
undefined,
spl.TOKEN_PROGRAM_ID
); );
if (tokenAmount <= 0 || tokenAmount <= associatedTokenAccount.amount) {
return associatedTokenAccount.address;
}
const amountNeeded = tokenAmount - Number(associatedTokenAccount.amount);
if (amountNeeded <= 0) {
return associatedTokenAccount.address;
}
if (amountNeeded > balance) {
throw new Error(
`Payer account does not enough balance to fund new token account, need ${amountNeeded}, have ${balance}`
);
}
const finalBalance = await transferWrappedSol(
program.provider.connection,
payerKeypair,
amountNeeded
);
return associatedTokenAccount.address;
} }
/** Load SwitchboardTestContext using a specified queue
* @param provider anchor Provider containing connection and payer Keypair
* @param queueKey the oracle queue to load
* @param tokenAmount number of tokens to populate in switchboard mint's associated token account
*/
static async loadDevnetQueue( static async loadDevnetQueue(
provider: anchor.AnchorProvider, provider: anchor.AnchorProvider,
queueKey = "F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy" queueKey = "F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy",
tokenAmount = 0
) { ) {
const payerKeypair = (provider.wallet as sbv2.AnchorWallet).payer; const payerKeypair = (provider.wallet as sbv2.AnchorWallet).payer;
let program: anchor.Program; let program: anchor.Program;
@ -94,26 +130,14 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
`Failed to load the SBV2 mint for the given cluster, ${error.message}` `Failed to load the SBV2 mint for the given cluster, ${error.message}`
); );
} }
let payerTokenWallet: PublicKey;
try { const payerTokenWallet =
payerTokenWallet = ( await SwitchboardTestContext.getOrCreateSwitchboardWallet(
await spl.getOrCreateAssociatedTokenAccount( program,
provider.connection, mint,
payerKeypair, tokenAmount
mint.address,
payerKeypair.publicKey,
undefined,
undefined,
undefined,
spl.TOKEN_PROGRAM_ID,
spl.ASSOCIATED_TOKEN_PROGRAM_ID
)
).address;
} catch (error: any) {
throw new Error(
`Failed to load the token wallet for SBV2 mint on the given cluster, ${error.message}`
); );
}
return new SwitchboardTestContext({ return new SwitchboardTestContext({
program, program,
queue, queue,
@ -134,6 +158,14 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
let currentDirectory = process.cwd(); let currentDirectory = process.cwd();
while (retryCount > 0) { while (retryCount > 0) {
// look for switchboard.env
try {
const currentPath = path.join(currentDirectory, envFileName);
if (fs.existsSync(currentPath)) {
return currentPath;
}
} catch {}
// look for .switchboard directory // look for .switchboard directory
try { try {
const localSbvPath = path.join(currentDirectory, ".switchboard"); const localSbvPath = path.join(currentDirectory, ".switchboard");
@ -145,16 +177,7 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
} }
} catch {} } catch {}
// look for switchboard.env currentDirectory = path.join(currentDirectory, "../");
try {
const currentPath = path.join(currentDirectory, envFileName);
if (fs.existsSync(currentPath)) {
return currentPath;
}
currentDirectory = path.join(currentDirectory, "../");
} catch {
throw NotFoundError;
}
retryCount--; retryCount--;
} }
@ -165,10 +188,12 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
/** Load SwitchboardTestContext from an env file containing $SWITCHBOARD_PROGRAM_ID, $ORACLE_QUEUE, $AGGREGATOR /** Load SwitchboardTestContext from an env file containing $SWITCHBOARD_PROGRAM_ID, $ORACLE_QUEUE, $AGGREGATOR
* @param provider anchor Provider containing connection and payer Keypair * @param provider anchor Provider containing connection and payer Keypair
* @param filePath filesystem path to env file * @param filePath filesystem path to env file
* @param tokenAmount number of tokens to populate in switchboard mint's associated token account
*/ */
public static async loadFromEnv( public static async loadFromEnv(
provider: anchor.AnchorProvider, provider: anchor.AnchorProvider,
filePath = SwitchboardTestContext.findSwitchboardEnv() filePath = SwitchboardTestContext.findSwitchboardEnv(),
tokenAmount = 0
): Promise<SwitchboardTestContext> { ): Promise<SwitchboardTestContext> {
require("dotenv").config({ path: filePath }); require("dotenv").config({ path: filePath });
if (!process.env.SWITCHBOARD_PROGRAM_ID) { if (!process.env.SWITCHBOARD_PROGRAM_ID) {
@ -219,26 +244,13 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
`Failed to load the SBV2 mint for the given cluster, ${error.message}` `Failed to load the SBV2 mint for the given cluster, ${error.message}`
); );
} }
let payerTokenWallet: PublicKey;
try { const payerTokenWallet =
payerTokenWallet = ( await SwitchboardTestContext.getOrCreateSwitchboardWallet(
await spl.getOrCreateAssociatedTokenAccount( switchboardProgram,
provider.connection, mint,
payerKeypair, tokenAmount
mint.address,
payerKeypair.publicKey,
undefined,
undefined,
undefined,
spl.TOKEN_PROGRAM_ID,
spl.ASSOCIATED_TOKEN_PROGRAM_ID
)
).address;
} catch (error: any) {
throw new Error(
`Failed to load the token wallet for SBV2 mint on the given cluster, ${error.message}`
); );
}
const context: ISwitchboardTestContext = { const context: ISwitchboardTestContext = {
program: switchboardProgram, program: switchboardProgram,
@ -256,7 +268,6 @@ export class SwitchboardTestContext implements ISwitchboardTestContext {
value: number, value: number,
timeout = 30 timeout = 30
): Promise<sbv2.AggregatorAccount> { ): Promise<sbv2.AggregatorAccount> {
const queue = await this.queue.loadData();
const payerKeypair = sbv2.programWallet(this.program); const payerKeypair = sbv2.programWallet(this.program);
const staticJob = await sbv2.JobAccount.create(this.program, { const staticJob = await sbv2.JobAccount.create(this.program, {

View File

@ -13,7 +13,7 @@ import path from "path";
import { getIdlAddress, getProgramDataAddress } from "../anchor.js"; import { getIdlAddress, getProgramDataAddress } from "../anchor.js";
import { anchorBNtoDateString } from "../date.js"; import { anchorBNtoDateString } from "../date.js";
import { createQueue } from "../queue.js"; import { createQueue } from "../queue.js";
import { getOrCreateSwitchboardTokenAccount } from "../state.js"; import { getOrCreateSwitchboardTokenAccount } from "../token.js";
const LATEST_DOCKER_VERSION = "dev-v2-07-11-22"; const LATEST_DOCKER_VERSION = "dev-v2-07-11-22";
@ -323,87 +323,6 @@ secrets:
); );
const idlAddress = await getIdlAddress(switchboardProgram.programId); const idlAddress = await getIdlAddress(switchboardProgram.programId);
// const [switchboardProgramState] =
// sbv2.ProgramStateAccount.fromSeed(switchboardProgram);
// let programState: any;
// try {
// programState = await switchboardProgramState.loadData();
// } catch {
// await sbv2.ProgramStateAccount.create(switchboardProgram, {
// mint: spl.NATIVE_MINT,
// daoMint: spl.NATIVE_MINT,
// });
// programState = await switchboardProgramState.loadData();
// }
// const mint = await switchboardProgramState.getTokenMint();
// const payerSwitchboardWallet = (
// await spl.getOrCreateAssociatedTokenAccount(
// connection,
// payerKeypair,
// mint.address,
// payerKeypair.publicKey,
// undefined,
// undefined,
// undefined,
// spl.TOKEN_PROGRAM_ID,
// spl.ASSOCIATED_TOKEN_PROGRAM_ID
// )
// ).address;
// // create queue with unpermissioned VRF accounts enabled
// const queueAccount = await sbv2.OracleQueueAccount.create(
// switchboardProgram,
// {
// name: Buffer.from("My Test Queue"),
// mint: spl.NATIVE_MINT,
// authority: payerKeypair.publicKey, // Approve new participants
// minStake: new anchor.BN(0), // Oracle minStake to heartbeat
// reward: new anchor.BN(0), // Oracle rewards per request (non-VRF)
// queueSize: 10, // Number of active oracles a queue can support
// unpermissionedFeeds: true, // Whether feeds need PERMIT_ORACLE_QUEUE_USAGE permissions
// unpermissionedVrf: true, // Whether VRF accounts need PERMIT_VRF_REQUESTS permissions
// enableBufferRelayers: true,
// }
// );
// await queueAccount.setVrfSettings({
// authority: payerKeypair,
// unpermissionedVrf: true,
// });
// const queue = await queueAccount.loadData();
// // create a crank for the queue
// const crankAccount = await sbv2.CrankAccount.create(switchboardProgram, {
// name: Buffer.from("My Crank"),
// maxRows: 100,
// queueAccount,
// });
// const crank = await crankAccount.loadData();
// // create oracle to run locally
// const oracleAccount = await sbv2.OracleAccount.create(switchboardProgram, {
// name: Buffer.from("My Oracle"),
// oracleAuthority: payerKeypair,
// queueAccount,
// });
// const oracle = await oracleAccount.loadData();
// // grant oracle heartbeat permissions
// const oraclePermissionAccount = await sbv2.PermissionAccount.create(
// switchboardProgram,
// {
// authority: queue.authority,
// granter: queueAccount.publicKey,
// grantee: oracleAccount.publicKey,
// }
// );
// await oraclePermissionAccount.set({
// authority: payerKeypair,
// enable: true,
// permission: sbv2.SwitchboardPermission.PERMIT_ORACLE_HEARTBEAT,
// });
const queueResponse = await createQueue( const queueResponse = await createQueue(
switchboardProgram, switchboardProgram,
{ {

View File

@ -0,0 +1,110 @@
import type * as anchor from "@project-serum/anchor";
import * as spl from "@solana/spl-token";
import {
Connection,
Keypair,
PublicKey,
sendAndConfirmTransaction,
SystemProgram,
Transaction,
} from "@solana/web3.js";
import {
ProgramStateAccount,
programWallet,
} from "@switchboard-xyz/switchboard-v2";
export const getOrCreateSwitchboardTokenAccount = async (
program: anchor.Program,
switchboardMint?: spl.Mint,
payer = programWallet(program)
): Promise<PublicKey> => {
const getAssociatedAddress = async (mint: spl.Mint): Promise<PublicKey> => {
const tokenAccount = await spl.getOrCreateAssociatedTokenAccount(
program.provider.connection,
payer,
mint.address,
payer.publicKey,
undefined,
undefined,
undefined,
spl.TOKEN_PROGRAM_ID,
spl.ASSOCIATED_TOKEN_PROGRAM_ID
);
return tokenAccount.address;
};
let mint = switchboardMint;
if (mint) {
return getAssociatedAddress(mint);
}
const [programState] = ProgramStateAccount.fromSeed(program);
mint = await programState.getTokenMint();
if (mint) {
return getAssociatedAddress(mint);
}
throw new Error(`failed to get associated token account`);
};
export async function transferWrappedSol(
connection: Connection,
payerKeypair: Keypair,
amount: number
): Promise<number> {
const payerBalance = await connection.getBalance(payerKeypair.publicKey);
const payerAssociatedWallet = (
await spl.getOrCreateAssociatedTokenAccount(
connection,
payerKeypair,
spl.NATIVE_MINT,
payerKeypair.publicKey
)
).address;
// create new account to temporarily hold wrapped funds
const ephemeralAccount = Keypair.generate();
const ephemeralWallet = await spl.getAssociatedTokenAddress(
spl.NATIVE_MINT,
ephemeralAccount.publicKey
);
const tx = new Transaction().add(
spl.createAssociatedTokenAccountInstruction(
payerKeypair.publicKey,
ephemeralWallet,
payerKeypair.publicKey,
spl.NATIVE_MINT,
spl.TOKEN_PROGRAM_ID,
spl.ASSOCIATED_TOKEN_PROGRAM_ID
),
SystemProgram.transfer({
fromPubkey: payerKeypair.publicKey,
toPubkey: ephemeralWallet,
lamports: amount,
}),
spl.createSyncNativeInstruction(ephemeralWallet, spl.TOKEN_PROGRAM_ID),
spl.createTransferInstruction(
ephemeralWallet,
payerAssociatedWallet,
payerKeypair.publicKey,
amount,
[payerKeypair, ephemeralAccount],
spl.TOKEN_PROGRAM_ID
),
spl.createCloseAccountInstruction(
ephemeralWallet,
payerKeypair.publicKey,
payerKeypair.publicKey,
[payerKeypair, ephemeralAccount],
spl.TOKEN_PROGRAM_ID
)
);
const txn = await sendAndConfirmTransaction(connection, tx, [
payerKeypair,
ephemeralAccount,
]);
const finalBalance = await spl.getAccount(connection, payerAssociatedWallet);
return Number(finalBalance.amount);
}

View File

@ -1,6 +1,7 @@
import * as anchor from "@project-serum/anchor"; import * as anchor from "@project-serum/anchor";
import { import {
promiseWithTimeout, promiseWithTimeout,
sleep,
SwitchboardTestContext, SwitchboardTestContext,
} from "@switchboard-xyz/sbv2-utils"; } from "@switchboard-xyz/sbv2-utils";
import { import {
@ -17,11 +18,6 @@ import {
} from "../../../target/types/anchor_buffer_parser"; } from "../../../target/types/anchor_buffer_parser";
import { PROGRAM_ID } from "../client/programId"; import { PROGRAM_ID } from "../client/programId";
const sleep = (ms: number): Promise<any> =>
new Promise((s) => setTimeout(s, ms));
// Anchor.toml will copy this to localnet when we start our tests
describe("anchor-buffer-parser test", () => { describe("anchor-buffer-parser test", () => {
const provider = anchor.AnchorProvider.env(); const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider); anchor.setProvider(provider);
@ -51,7 +47,7 @@ describe("anchor-buffer-parser test", () => {
} }
// If fails, throw error // If fails, throw error
throw new Error( throw new Error(
`Failed to load the SwitchboardTestContext from devnet or from a switchboard.env file` `Failed to load the SwitchboardTestContext from a switchboard.env file`
); );
}); });

View File

@ -7,7 +7,8 @@
"noEmit": true, "noEmit": true,
"esModuleInterop": true, "esModuleInterop": true,
"paths": { "paths": {
"@switchboard-xyz/switchboard-v2": ["../../libraries/ts"] "@switchboard-xyz/switchboard-v2": ["../../libraries/ts"],
"@switchboard-xyz/sbv2-utils": ["../../libraries/sbv2-utils"]
} }
}, },
"include": [ "include": [
@ -15,5 +16,8 @@
"client/**/*", "client/**/*",
"../../target/types/anchor_feed_parser" "../../target/types/anchor_feed_parser"
], ],
"references": [{ "path": "../../libraries/ts" }] "references": [
{ "path": "../../libraries/ts" },
{ "path": "../../libraries/sbv2-utils" }
]
} }

View File

@ -1,6 +1,6 @@
import * as anchor from "@project-serum/anchor"; import * as anchor from "@project-serum/anchor";
import { PublicKey } from "@solana/web3.js"; import { PublicKey } from "@solana/web3.js";
import { SwitchboardTestContext } from "@switchboard-xyz/sbv2-utils"; import { sleep, SwitchboardTestContext } from "@switchboard-xyz/sbv2-utils";
import type { AnchorWallet } from "@switchboard-xyz/switchboard-v2"; import type { AnchorWallet } from "@switchboard-xyz/switchboard-v2";
import assert from "assert"; import assert from "assert";
import { import {
@ -9,9 +9,6 @@ import {
} from "../../../target/types/anchor_feed_parser"; } from "../../../target/types/anchor_feed_parser";
import { PROGRAM_ID } from "../client/programId"; import { PROGRAM_ID } from "../client/programId";
const sleep = (ms: number): Promise<any> =>
new Promise((s) => setTimeout(s, ms));
// Anchor.toml will copy this to localnet when we start our tests // Anchor.toml will copy this to localnet when we start our tests
const DEFAULT_SOL_USD_FEED = new PublicKey( const DEFAULT_SOL_USD_FEED = new PublicKey(
"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR" "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"
@ -35,12 +32,14 @@ describe("anchor-feed-parser test", () => {
let switchboard: SwitchboardTestContext; let switchboard: SwitchboardTestContext;
let aggregatorKey: PublicKey; let aggregatorKey: PublicKey;
let localnet = false;
before(async () => { before(async () => {
// First, attempt to load the switchboard devnet PID // First, attempt to load the switchboard devnet PID
try { try {
switchboard = await SwitchboardTestContext.loadDevnetQueue(provider); switchboard = await SwitchboardTestContext.loadDevnetQueue(
provider,
"F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy"
);
aggregatorKey = DEFAULT_SOL_USD_FEED; aggregatorKey = DEFAULT_SOL_USD_FEED;
console.log("devnet detected"); console.log("devnet detected");
return; return;
@ -52,8 +51,7 @@ describe("anchor-feed-parser test", () => {
switchboard = await SwitchboardTestContext.loadFromEnv(provider); switchboard = await SwitchboardTestContext.loadFromEnv(provider);
const aggregatorAccount = await switchboard.createStaticFeed(100); const aggregatorAccount = await switchboard.createStaticFeed(100);
aggregatorKey = aggregatorAccount.publicKey ?? PublicKey.default; aggregatorKey = aggregatorAccount.publicKey ?? PublicKey.default;
localnet = true; console.log("local env detected");
console.log("localnet detected");
return; return;
} catch (error: any) { } catch (error: any) {
console.log(`Error: SBV2 Localnet - ${error.message}`); console.log(`Error: SBV2 Localnet - ${error.message}`);

View File

@ -7,7 +7,8 @@
"noEmit": true, "noEmit": true,
"esModuleInterop": true, "esModuleInterop": true,
"paths": { "paths": {
"@switchboard-xyz/switchboard-v2": ["../../libraries/ts"] "@switchboard-xyz/switchboard-v2": ["../../libraries/ts"],
"@switchboard-xyz/sbv2-utils": ["../../libraries/sbv2-utils"]
} }
}, },
"include": [ "include": [
@ -15,5 +16,8 @@
"client/**/*", "client/**/*",
"../../target/types/anchor_feed_parser" "../../target/types/anchor_feed_parser"
], ],
"references": [{ "path": "../../libraries/ts" }] "references": [
{ "path": "../../libraries/ts" },
{ "path": "../../libraries/sbv2-utils" }
]
} }

View File

@ -66,7 +66,10 @@ describe("anchor-vrf-parser test", () => {
before(async () => { before(async () => {
// First, attempt to load the switchboard devnet PID // First, attempt to load the switchboard devnet PID
try { try {
switchboard = await SwitchboardTestContext.loadDevnetQueue(provider); switchboard = await SwitchboardTestContext.loadDevnetQueue(
provider,
"F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy"
);
console.log("devnet detected"); console.log("devnet detected");
return; return;
} catch (error: any) { } catch (error: any) {

View File

@ -40,12 +40,14 @@ describe("native-feed-parser test", () => {
let switchboard: SwitchboardTestContext; let switchboard: SwitchboardTestContext;
let aggregatorKey: PublicKey; let aggregatorKey: PublicKey;
let localnet = false;
before(async () => { before(async () => {
// First, attempt to load the switchboard devnet PID // First, attempt to load the switchboard devnet PID
try { try {
switchboard = await SwitchboardTestContext.loadDevnetQueue(provider); switchboard = await SwitchboardTestContext.loadDevnetQueue(
provider,
"F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy"
);
aggregatorKey = DEFAULT_SOL_USD_FEED; aggregatorKey = DEFAULT_SOL_USD_FEED;
console.log("devnet detected"); console.log("devnet detected");
return; return;
@ -57,8 +59,7 @@ describe("native-feed-parser test", () => {
switchboard = await SwitchboardTestContext.loadFromEnv(provider); switchboard = await SwitchboardTestContext.loadFromEnv(provider);
const aggregatorAccount = await switchboard.createStaticFeed(100); const aggregatorAccount = await switchboard.createStaticFeed(100);
aggregatorKey = aggregatorAccount.publicKey ?? PublicKey.default; aggregatorKey = aggregatorAccount.publicKey ?? PublicKey.default;
localnet = true; console.log("local env detected");
console.log("localnet detected");
return; return;
} catch (error: any) { } catch (error: any) {
console.log(`Error: SBV2 Localnet - ${error.message}`); console.log(`Error: SBV2 Localnet - ${error.message}`);

View File

@ -9,10 +9,14 @@
"esModuleInterop": true, "esModuleInterop": true,
"noEmit": true, "noEmit": true,
"paths": { "paths": {
"@switchboard-xyz/switchboard-v2": ["../../libraries/ts"] "@switchboard-xyz/switchboard-v2": ["../../libraries/ts"],
"@switchboard-xyz/sbv2-utils": ["../../libraries/sbv2-utils"]
} }
}, },
// "include": ["oldtests/**/**/*"], // "include": ["oldtests/**/**/*"],
"exclude": ["target"], "exclude": ["target"],
"references": [{ "path": "../../libraries/ts" }] "references": [
{ "path": "../../libraries/ts" },
{ "path": "../../libraries/sbv2-utils" }
]
} }

View File

@ -3942,29 +3942,6 @@
superstruct "^0.14.2" superstruct "^0.14.2"
tweetnacl "^1.0.0" tweetnacl "^1.0.0"
"@solana/web3.js@^1.47.3":
version "1.48.0"
resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.48.0.tgz#331281b2d80640431fb3b6fdc6b704ec325917aa"
integrity sha512-Gb6XvdhGjGI7CdAXLmlMIEvEYvrwqc78JOtwCsSrTqzz7Ek/BhJpZ/Cv89gxRDrWxf6kHegAfaN2FxwuYMmDZQ==
dependencies:
"@babel/runtime" "^7.12.5"
"@ethersproject/sha2" "^5.5.0"
"@solana/buffer-layout" "^4.0.0"
bigint-buffer "^1.1.5"
bn.js "^5.0.0"
borsh "^0.7.0"
bs58 "^4.0.1"
buffer "6.0.1"
fast-stable-stringify "^1.0.0"
jayson "^3.4.4"
js-sha3 "^0.8.0"
node-fetch "2"
react-native-url-polyfill "^1.3.0"
rpc-websockets "^7.5.0"
secp256k1 "^4.0.2"
superstruct "^0.14.2"
tweetnacl "^1.0.0"
"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": "@svgr/babel-plugin-add-jsx-attribute@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906"
@ -13974,13 +13951,6 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1:
dependencies: dependencies:
"@babel/runtime" "^7.10.3" "@babel/runtime" "^7.10.3"
react-native-url-polyfill@^1.3.0:
version "1.3.0"
resolved "https://registry.npmjs.org/react-native-url-polyfill/-/react-native-url-polyfill-1.3.0.tgz#c1763de0f2a8c22cc3e959b654c8790622b6ef6a"
integrity sha512-w9JfSkvpqqlix9UjDvJjm1EjSt652zVQ6iwCIj1cVVkwXf4jQhQgTNXY6EVTwuAmUjg6BC6k9RHCBynoLFo3IQ==
dependencies:
whatwg-url-without-unicode "8.0.0-3"
react-player@^2.10.1: react-player@^2.10.1:
version "2.10.1" version "2.10.1"
resolved "https://registry.yarnpkg.com/react-player/-/react-player-2.10.1.tgz#f2ee3ec31393d7042f727737545414b951ffc7e4" resolved "https://registry.yarnpkg.com/react-player/-/react-player-2.10.1.tgz#f2ee3ec31393d7042f727737545414b951ffc7e4"
@ -14657,19 +14627,6 @@ rpc-websockets@^7.4.2:
bufferutil "^4.0.1" bufferutil "^4.0.1"
utf-8-validate "^5.0.2" utf-8-validate "^5.0.2"
rpc-websockets@^7.5.0:
version "7.5.0"
resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748"
integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ==
dependencies:
"@babel/runtime" "^7.17.2"
eventemitter3 "^4.0.7"
uuid "^8.3.2"
ws "^8.5.0"
optionalDependencies:
bufferutil "^4.0.1"
utf-8-validate "^5.0.2"
rtl-detect@^1.0.4: rtl-detect@^1.0.4:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6"
@ -16730,11 +16687,6 @@ webidl-conversions@^3.0.0:
resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
webidl-conversions@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
webidl-conversions@^6.1.0: webidl-conversions@^6.1.0:
version "6.1.0" version "6.1.0"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
@ -16868,15 +16820,6 @@ websocket-extensions@>=0.1.1:
resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
whatwg-url-without-unicode@8.0.0-3:
version "8.0.0-3"
resolved "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b"
integrity sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==
dependencies:
buffer "^5.4.3"
punycode "^2.1.1"
webidl-conversions "^5.0.0"
whatwg-url@^5.0.0: whatwg-url@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"