diff --git a/libraries/sbv2-utils/package.json b/libraries/sbv2-utils/package.json index 89a3707..3df9aec 100644 --- a/libraries/sbv2-utils/package.json +++ b/libraries/sbv2-utils/package.json @@ -27,7 +27,7 @@ "types": "lib/cjs/index.d.ts", "scripts": { "docgen": "typedoc --entryPoints src/index.ts --out ../../website/static/api/sbv2-utils", - "test": "echo \"No test script for @switchboard-xyz/sbv2-utils\" && exit 0", + "test": "ts-mocha -p ./tsconfig.cjs.json -t 1000000 ./tests/*.tests.ts", "build": "shx rm -rf lib && tsc && tsc -p tsconfig.cjs.json", "watch": "tsc -p tsconfig.cjs.json --watch", "prepublishOnly": "shx rm -rf lib && yarn build" @@ -44,12 +44,15 @@ "chalk": "4", "decimal.js": "^10.3.1", "dotenv": "^16.0.1", + "mocha": "^9.1.1", "toml": "^3.0.0" }, "devDependencies": { "@types/big.js": "^6.1.3", + "@types/mocha": "^9.0.0", "@types/node": "^17.0.45", "shx": "^0.3.4", + "ts-mocha": "^9.0.2", "typedoc": "^0.23.8", "typescript": "^4.6.3" } diff --git a/libraries/sbv2-utils/src/feed.ts b/libraries/sbv2-utils/src/feed.ts index 4039c30..d05b14d 100644 --- a/libraries/sbv2-utils/src/feed.ts +++ b/libraries/sbv2-utils/src/feed.ts @@ -258,7 +258,7 @@ export async function createAggregatorReq( aggregator: aggregatorKeypair.publicKey, authority, queue: params.queueAccount.publicKey, - authorWallet: params.authorWallet ?? state.tokenVault, + // authorWallet: params.authorWallet ?? state.tokenVault, programState: programStateAccount.publicKey, }) .instruction(), @@ -266,7 +266,7 @@ export async function createAggregatorReq( .permissionInit({}) .accounts({ permission: permissionAccount.publicKey, - authority: params.authority, + authority: queue.authority, granter: queueAccount.publicKey, grantee: aggregatorKeypair.publicKey, payer: payerPubkey, @@ -289,9 +289,7 @@ export async function createAggregatorReq( payerPubkey, leaseEscrow, leaseAccount.publicKey, - mint.address, - spl.TOKEN_PROGRAM_ID, - spl.ASSOCIATED_TOKEN_PROGRAM_ID + mint.address ), await program.methods .leaseInit({ @@ -328,7 +326,7 @@ export async function createAggregatorReq( }) .accounts({ aggregator: aggregatorKeypair.publicKey, - authority: payerPubkey, + authority, job: jobAccount.publicKey, }) .instruction(); diff --git a/libraries/sbv2-utils/src/test/context.ts b/libraries/sbv2-utils/src/test/context.ts index 15dc563..ce54c85 100644 --- a/libraries/sbv2-utils/src/test/context.ts +++ b/libraries/sbv2-utils/src/test/context.ts @@ -228,10 +228,11 @@ export class SwitchboardTestContext implements ISwitchboardTestContext { ); if (!balance) { try { - await provider.connection.requestAirdrop( + const airdropSignature = await provider.connection.requestAirdrop( payerKeypair.publicKey, 1_000_000_000 ); + await provider.connection.confirmTransaction(airdropSignature); } catch {} } diff --git a/libraries/sbv2-utils/tests/feed.tests.ts b/libraries/sbv2-utils/tests/feed.tests.ts new file mode 100644 index 0000000..ba50304 --- /dev/null +++ b/libraries/sbv2-utils/tests/feed.tests.ts @@ -0,0 +1,169 @@ +import * as anchor from "@project-serum/anchor"; +import { + AnchorWallet, + JobAccount, + OracleJob, +} from "@switchboard-xyz/switchboard-v2"; +import fs from "fs"; +import "mocha"; +import { + awaitOpenRound, + createAggregator, + SwitchboardTestContext, +} from "../lib/cjs"; + +describe("Feed tests", () => { + // const payer = anchor.web3.Keypair.generate(); + + const payer = anchor.web3.Keypair.fromSecretKey( + new Uint8Array( + JSON.parse(fs.readFileSync("../../../payer-keypair.json", "utf8")) + ) + ); + + let switchboard: SwitchboardTestContext; + + before(async () => { + try { + const localnetConnection = new anchor.web3.Connection( + "http://localhost:8899" + ); + const provider = new anchor.AnchorProvider( + localnetConnection, + new AnchorWallet(payer), + { commitment: "confirmed" } + ); + switchboard = await SwitchboardTestContext.loadFromEnv(provider); + console.log("local env detected"); + return; + } catch (error: any) {} + + try { + const devnetConnection = new anchor.web3.Connection( + "https://devnet.genesysgo.net/" + ); + const provider = new anchor.AnchorProvider( + devnetConnection, + new AnchorWallet(payer), + { commitment: "confirmed" } + ); + // const airdropSignature = await devnetConnection.requestAirdrop( + // payer.publicKey, + // anchor.web3.LAMPORTS_PER_SOL + // ); + // await devnetConnection.confirmTransaction(airdropSignature); + switchboard = await SwitchboardTestContext.loadDevnetQueue( + provider, + "F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy" + ); + console.log("devnet detected"); + return; + } catch (error: any) { + // console.log(`Error: SBV2 Devnet - ${error.message}`); + console.error(error); + } + + if (!switchboard) { + // If fails, throw error + throw new Error( + `Failed to load the SwitchboardTestContext from devnet or from a switchboard.env file` + ); + } + + const airdropSignature = + await switchboard.program.provider.connection.requestAirdrop( + payer.publicKey, + anchor.web3.LAMPORTS_PER_SOL + ); + await switchboard.program.provider.connection.confirmTransaction( + airdropSignature + ); + }); + + it("Creates a switchboard feed", async () => { + const job1 = await JobAccount.create(switchboard.program, { + name: Buffer.from("Job1"), + authority: payer.publicKey, + data: Buffer.from( + OracleJob.encodeDelimited( + OracleJob.create({ + tasks: [ + OracleJob.Task.create({ + httpTask: OracleJob.HttpTask.create({ + url: `https://ftx.us/api/markets/SOL_USD`, + }), + }), + OracleJob.Task.create({ + jsonParseTask: OracleJob.JsonParseTask.create({ + path: "$.result.price", + }), + }), + ], + }) + ).finish() + ), + }); + const job2 = await JobAccount.create(switchboard.program, { + name: Buffer.from("Job1"), + authority: payer.publicKey, + data: Buffer.from( + OracleJob.encodeDelimited( + OracleJob.create({ + tasks: [ + OracleJob.Task.create({ + httpTask: OracleJob.HttpTask.create({ + url: "https://www.binance.com/api/v3/ticker/price?symbol=SOLUSDT", + }), + }), + OracleJob.Task.create({ + jsonParseTask: OracleJob.JsonParseTask.create({ + path: "$.price", + }), + }), + OracleJob.Task.create({ + multiplyTask: OracleJob.MultiplyTask.create({ + aggregatorPubkey: + "ETAaeeuQBwsh9mC2gCov9WdhJENZuffRMXY2HgjCcSL9", + }), + }), + ], + }) + ).finish() + ), + }); + try { + const newAggregator = await createAggregator( + switchboard.program, + switchboard.queue, + { + name: Buffer.from("Test Feed"), + batchSize: 1, + minRequiredOracleResults: 1, + minRequiredJobResults: 1, + minUpdateDelaySeconds: 10, + queueAccount: switchboard.queue, + }, + [ + [job1, 1], + [job2, 1], + ] + ); + + console.log(`Created Aggregator: ${newAggregator.publicKey}`); + + // call openRound + const value = await awaitOpenRound( + newAggregator, + switchboard.queue, + switchboard.payerTokenWallet, + undefined, + 45 + ); + + console.log(`Aggregator Value: ${value.toString()}`); + } catch (error) { + console.error(error); + throw error; + } + }); +}); diff --git a/libraries/sbv2-utils/tsconfig.base.json b/libraries/sbv2-utils/tsconfig.base.json index 7c18e58..701d02a 100644 --- a/libraries/sbv2-utils/tsconfig.base.json +++ b/libraries/sbv2-utils/tsconfig.base.json @@ -1,9 +1,12 @@ { "include": ["./src/**/*"], + "exclude": ["tests/**/*", "lib", "node_modules"], "files": ["./src/index.ts"], "compilerOptions": { - "target": "es2019", + // "target": "es2019", + "composite": true, "sourceMap": true, + "inlineSources": true, "declaration": true, "declarationMap": true, "allowSyntheticDefaultImports": true, @@ -11,8 +14,8 @@ "emitDecoratorMetadata": true, "esModuleInterop": true, "resolveJsonModule": true, - "composite": true, "skipLibCheck": true, + "types": ["mocha", "node", "long"], // strict "strict": true, "noImplicitThis": true, @@ -23,11 +26,7 @@ "noImplicitReturns": true, "strictPropertyInitialization": true, "paths": { - "@switchboard-xyz/switchboard-v2": ["../ts"], - "@solana/spl-token": [ - "../../node_modules/@solana/spl-token", - "./node_modules/@solana/spl-token" - ] + "@switchboard-xyz/switchboard-v2": ["../ts"] } }, "references": [{ "path": "../ts" }] diff --git a/libraries/ts/package.json b/libraries/ts/package.json index 26ecc06..d6f15e7 100644 --- a/libraries/ts/package.json +++ b/libraries/ts/package.json @@ -39,7 +39,7 @@ "build:esm": "tsc && yarn build:esm:protos", "build": "yarn build:protos && yarn build:cjs && yarn build:esm", "watch": "tsc -p tsconfig.cjs.json --watch", - "test": "mocha --extension ts --require ts-node/register -t 1000000 tests/", + "test": "ts-mocha -p ./tsconfig.cjs.json --require ts-node/register -t 1000000 ./tests/*.tests.ts", "lint": "eslint --fix-dry-run --ext .ts src/**/*.ts", "prepublish": "shx rm -rf lib && yarn build" }, @@ -52,7 +52,6 @@ "@solana/spl-governance": "^0.0.34", "@solana/spl-token-v2": "npm:@solana/spl-token@^0.2.0", "@solana/web3.js": "^1.44.3", - "@types/big.js": "^6.1.4", "assert": "^2.0.0", "big.js": "^6.2.0", "bs58": "^5.0.0", @@ -70,6 +69,7 @@ "@types/mocha": "^9.0.0", "@types/node": "^17.0.45", "shx": "^0.3.4", + "ts-mocha": "^9.0.2", "typedoc": "^0.23.8", "typescript": "^4.7" } diff --git a/libraries/ts/tests/decimal-tests.ts b/libraries/ts/tests/decimal.tests.ts similarity index 100% rename from libraries/ts/tests/decimal-tests.ts rename to libraries/ts/tests/decimal.tests.ts diff --git a/libraries/ts/tests/program-wallet-tests.ts b/libraries/ts/tests/program-wallet.tests.ts similarity index 100% rename from libraries/ts/tests/program-wallet-tests.ts rename to libraries/ts/tests/program-wallet.tests.ts