chore: pull monorepo changes (#119)

* Project import generated by Copybara.

GitOrigin-RevId: 8e1fcb690780885a2aa28fb132c00ed984c24f14

* chore: manual cleanup

---------

Co-authored-by: Copybara <copybara@example.com>
This commit is contained in:
gallynaut 2023-08-23 14:16:54 -06:00 committed by GitHub
parent 5e4cde758c
commit 9dc3df8a5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 371 additions and 256 deletions

View File

@ -18,9 +18,9 @@
"@project-serum/borsh": "^0.2.5", "@project-serum/borsh": "^0.2.5",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.8",
"@solana/web3.js": "^1.78.3", "@solana/web3.js": "^1.78.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/oracle": "latest", "@switchboard-xyz/oracle": "latest",
"@switchboard-xyz/solana.js": "^2.5.4", "@switchboard-xyz/solana.js": "^2.5.6",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"dotenv": "^16.0.1", "dotenv": "^16.0.1",
"yargs": "^17.5.1" "yargs": "^17.5.1"

View File

@ -17,9 +17,9 @@
"dependencies": { "dependencies": {
"@coral-xyz/anchor": "^0.28.0", "@coral-xyz/anchor": "^0.28.0",
"@solana/web3.js": "^1.77.3", "@solana/web3.js": "^1.77.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/oracle": "latest", "@switchboard-xyz/oracle": "latest",
"@switchboard-xyz/solana.js": "^2.5.4" "@switchboard-xyz/solana.js": "^2.5.6"
}, },
"devDependencies": { "devDependencies": {
"@types/chai": "^4.3.0", "@types/chai": "^4.3.0",

View File

@ -19,6 +19,6 @@ cpi = ["no-entrypoint"]
default = [] default = []
[dependencies] [dependencies]
switchboard-solana = "0.28.4" switchboard-solana = "=0.28.6"
# switchboard-solana = { version = "0.28.4", path = "../../../rust/switchboard-solana" } # switchboard-solana = { version = "0.28.4", path = "../../../rust/switchboard-solana" }
bytemuck = "^1" bytemuck = "^1"

View File

@ -13,9 +13,9 @@
}, },
"dependencies": { "dependencies": {
"@coral-xyz/anchor": "^0.28.0", "@coral-xyz/anchor": "^0.28.0",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.6",
"@solana/web3.js": "^1.78.4", "@solana/web3.js": "^1.78.0",
"@switchboard-xyz/solana.js": "^2.5.4" "@switchboard-xyz/solana.js": "^2.5.6"
}, },
"devDependencies": { "devDependencies": {
"@types/bn.js": "^5.1.0", "@types/bn.js": "^5.1.0",

View File

@ -16,6 +16,6 @@ futures = "0.3"
serde = "^1" serde = "^1"
serde_json = "^1" serde_json = "^1"
switchboard-utils = "0.8.0" switchboard-utils = "0.8.0"
switchboard-solana = "0.28.4" switchboard-solana = "=0.28.6"
# switchboard-solana = { version = "0.28.4", path = "../../../../rust/switchboard-solana" } # switchboard-solana = { version = "0.28.4", path = "../../../../rust/switchboard-solana" }
# switchboard-utils = { version = "0.8.0", path = "../../../../../../rust/switchboard-utils" } # switchboard-utils = { version = "0.8.0", path = "../../../../../../rust/switchboard-utils" }

View File

@ -9,16 +9,16 @@ DOCKER_BUILD_COMMAND=DOCKER_BUILDKIT=1 docker buildx build --platform linux/amd6
# Default make task # Default make task
all: build all: build
docker_build: docker_build:
${DOCKER_BUILD_COMMAND} --pull -f Dockerfile -t ${DOCKER_IMAGE_NAME}:latest --load ../ ${DOCKER_BUILD_COMMAND} --pull -f Dockerfile -t ${DOCKER_IMAGE_NAME}:latest --load ../
docker_publish: docker_publish:
${DOCKER_BUILD_COMMAND} --pull -f Dockerfile -t ${DOCKER_IMAGE_NAME}:latest --push ../ ${DOCKER_BUILD_COMMAND} --pull -f Dockerfile -t ${DOCKER_IMAGE_NAME}:latest --push ../
dev_docker_build: dev_docker_build:
${DOCKER_BUILD_COMMAND} --pull -f Dockerfile.dev -t ${DOCKER_IMAGE_NAME}:latest --load ../../../../../../ ${DOCKER_BUILD_COMMAND} --pull -f Dockerfile.dev -t ${DOCKER_IMAGE_NAME}:latest --load ../../../../../../
dev_docker_publish: dev_docker_publish:
${DOCKER_BUILD_COMMAND} --pull -f Dockerfile.dev -t ${DOCKER_IMAGE_NAME}:latest --push ../../../../../../ ${DOCKER_BUILD_COMMAND} --pull -f Dockerfile.dev -t ${DOCKER_IMAGE_NAME}:latest --push ../../../../../../
build: docker_build measurement build: docker_build measurement
@ -30,15 +30,16 @@ publish: docker_publish measurement
dev_publish: dev_docker_publish measurement dev_publish: dev_docker_publish measurement
measurement: measurement:
@docker run -d --platform=linux/amd64 --pull always -q --name=my-switchboard-function ${DOCKER_IMAGE_NAME}:latest > /dev/null @docker run -d --platform=linux/amd64 -q --name=my-switchboard-function ${DOCKER_IMAGE_NAME}:latest > /dev/null
@docker cp my-switchboard-function:/measurement.txt measurement.txt @docker cp my-switchboard-function:/measurement.txt measurement.txt
@echo -n 'MrEnclve: '
@cat measurement.txt
@docker stop my-switchboard-function > /dev/null @docker stop my-switchboard-function > /dev/null
@docker rm my-switchboard-function > /dev/null @docker rm my-switchboard-function > /dev/null
@echo MrEnclave: $(shell cat ./measurement.txt)
simulate: docker_build simulate: docker_build
docker run -it --platform=linux/amd64 --entrypoint=/bin/bash ${DOCKER_IMAGE_NAME}:latest /boot.sh --test docker run -it --platform=linux/amd64 --entrypoint=/bin/bash ${DOCKER_IMAGE_NAME}:latest /boot.sh --test
# Task to clean up the compiled rust application # Task to clean up the compiled rust application
clean: clean:
cargo clean cargo clean
@ -48,4 +49,4 @@ clean:
# @docker cp latest-my-switchboard-function:/measurement.txt latest-measurement.txt # @docker cp latest-my-switchboard-function:/measurement.txt latest-measurement.txt
# @docker stop latest-my-switchboard-function > /dev/null # @docker stop latest-my-switchboard-function > /dev/null
# @docker rm latest-my-switchboard-function > /dev/null # @docker rm latest-my-switchboard-function > /dev/null
# @echo latest MrEnclave: $(shell rm ./latest-measurement.txt) # @echo latest MrEnclave: $(shell rm ./latest-measurement.txt)

View File

@ -14,8 +14,8 @@
"@coral-xyz/anchor": "^0.28.0", "@coral-xyz/anchor": "^0.28.0",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.8",
"@solana/web3.js": "^1.78.3", "@solana/web3.js": "^1.78.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/solana.js": "^2.5.4" "@switchboard-xyz/solana.js": "^2.5.6"
}, },
"devDependencies": { "devDependencies": {
"@types/bn.js": "^5.1.0", "@types/bn.js": "^5.1.0",

View File

@ -15,8 +15,8 @@
"@coral-xyz/anchor": "^0.28.0", "@coral-xyz/anchor": "^0.28.0",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.8",
"@solana/web3.js": "^1.78.3", "@solana/web3.js": "^1.78.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/solana.js": "^2.5.4" "@switchboard-xyz/solana.js": "^2.5.6"
}, },
"devDependencies": { "devDependencies": {
"@types/bn.js": "^5.1.0", "@types/bn.js": "^5.1.0",

View File

@ -10,8 +10,8 @@
"@coral-xyz/anchor": "^0.27.0", "@coral-xyz/anchor": "^0.27.0",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.8",
"@solana/web3.js": "^1.78.3", "@solana/web3.js": "^1.78.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/solana.js": "^2.5.4", "@switchboard-xyz/solana.js": "^2.5.6",
"dotenv": "^16.3.1" "dotenv": "^16.3.1"
}, },
"devDependencies": { "devDependencies": {

View File

@ -7,8 +7,8 @@
}, },
"dependencies": { "dependencies": {
"@coral-xyz/anchor": "^0.28.0", "@coral-xyz/anchor": "^0.28.0",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/solana.js": "^2.5.4" "@switchboard-xyz/solana.js": "^2.5.6"
}, },
"devDependencies": { "devDependencies": {
"@types/bn.js": "^5.1.0", "@types/bn.js": "^5.1.0",

View File

@ -18,9 +18,9 @@
"@project-serum/borsh": "^0.2.5", "@project-serum/borsh": "^0.2.5",
"@solana/spl-token": "^0.3.6", "@solana/spl-token": "^0.3.6",
"@solana/web3.js": "^1.77.3", "@solana/web3.js": "^1.77.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.4",
"@switchboard-xyz/oracle": "latest", "@switchboard-xyz/oracle": "latest",
"@switchboard-xyz/solana.js": "^2.5.4", "@switchboard-xyz/solana.js": "^2.5.6",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"dotenv": "^16.0.1", "dotenv": "^16.0.1",
"yargs": "^17.5.1" "yargs": "^17.5.1"

View File

@ -2,6 +2,11 @@
"version": "0.1.0", "version": "0.1.0",
"name": "switchboard_attestation_program", "name": "switchboard_attestation_program",
"instructions": [ "instructions": [
{
"name": "viewVersion",
"accounts": [],
"args": []
},
{ {
"name": "stateInit", "name": "stateInit",
"accounts": [ "accounts": [

View File

@ -2,6 +2,11 @@
"version": "0.1.0", "version": "0.1.0",
"name": "switchboard_v2", "name": "switchboard_v2",
"instructions": [ "instructions": [
{
"name": "viewVersion",
"accounts": [],
"args": []
},
{ {
"name": "aggregatorClose", "name": "aggregatorClose",
"accounts": [ "accounts": [

View File

@ -1,6 +1,6 @@
{ {
"name": "@switchboard-xyz/solana.js", "name": "@switchboard-xyz/solana.js",
"version": "2.5.4", "version": "2.5.6",
"author": "", "author": "",
"license": "MIT", "license": "MIT",
"description": "A Typescript client to interact with Switchboard on Solana.", "description": "A Typescript client to interact with Switchboard on Solana.",
@ -29,7 +29,7 @@
"@coral-xyz/borsh": "^0.28.0", "@coral-xyz/borsh": "^0.28.0",
"@solana/spl-token": "^0.3.8", "@solana/spl-token": "^0.3.8",
"@solana/web3.js": "^1.78.3", "@solana/web3.js": "^1.78.3",
"@switchboard-xyz/common": "^2.3.2", "@switchboard-xyz/common": "^2.3.3",
"cron-validator": "^1.3.1", "cron-validator": "^1.3.1",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"lodash": "^4.17.21" "lodash": "^4.17.21"

View File

@ -47,11 +47,14 @@ const ignoreFiles = [
`${v2GeneratedPath}/types/Lanes.ts`, // anchor-client-gen struggles with dual exports `${v2GeneratedPath}/types/Lanes.ts`, // anchor-client-gen struggles with dual exports
`${v2GeneratedPath}/types/index.ts`, // TODO: Need a better way to handle this. anchor-client-gen adds multiple, broken exports (for VRF builder) `${v2GeneratedPath}/types/index.ts`, // TODO: Need a better way to handle this. anchor-client-gen adds multiple, broken exports (for VRF builder)
`${v2GeneratedPath}/errors/index.ts`, // need to revert the program ID check, `${v2GeneratedPath}/errors/index.ts`, // need to revert the program ID check,
`${v2GeneratedPath}/instructions/viewVersion.ts`,
`${attestationGeneratedPath}/types/VerificationStatus.ts`, `${attestationGeneratedPath}/types/VerificationStatus.ts`,
`${attestationGeneratedPath}/errors/index.ts`, `${attestationGeneratedPath}/errors/index.ts`,
`${attestationGeneratedPath}/types/SwitchboardAttestationPermission.ts`, `${attestationGeneratedPath}/types/SwitchboardAttestationPermission.ts`,
`${attestationGeneratedPath}/instructions/functionDeactivateLookup.ts`, `${attestationGeneratedPath}/instructions/functionDeactivateLookup.ts`,
`${attestationGeneratedPath}/instructions/accountCloseOverride.ts`, `${attestationGeneratedPath}/instructions/accountCloseOverride.ts`,
`${attestationGeneratedPath}/instructions/viewVersion.ts`,
`${attestationGeneratedPath}/instructions/index.ts`, // make sure to disable this if adding more attestation program instructions. used to avoid name conflict on viewVersion ixn
// `${v2GeneratedPath}/types/VerificationStatus.ts`, // `${v2GeneratedPath}/types/VerificationStatus.ts`,
]; ];

View File

@ -11,6 +11,7 @@ import {
ProgramStateAccount, ProgramStateAccount,
QueueAccount, QueueAccount,
} from "./accounts/index.js"; } from "./accounts/index.js";
import { viewVersion as viewAttestationVersion } from "./generated/attestation-program/instructions/viewVersion.js";
import { import {
AggregatorAccountData, AggregatorAccountData,
BufferRelayerAccountData, BufferRelayerAccountData,
@ -24,6 +25,7 @@ import {
SlidingResultAccountData, SlidingResultAccountData,
VrfAccountData, VrfAccountData,
} from "./generated/index.js"; } from "./generated/index.js";
import { viewVersion as viewSbVersion } from "./generated/oracle-program/instructions/viewVersion.js";
import { import {
DEVNET_GENESIS_HASH, DEVNET_GENESIS_HASH,
MAINNET_GENESIS_HASH, MAINNET_GENESIS_HASH,
@ -46,6 +48,7 @@ import type { LoadedJobDefinition } from "./types.js";
import type { AccountNamespace, Idl, Wallet } from "@coral-xyz/anchor"; import type { AccountNamespace, Idl, Wallet } from "@coral-xyz/anchor";
import { import {
ACCOUNT_DISCRIMINATOR_SIZE, ACCOUNT_DISCRIMINATOR_SIZE,
AnchorError,
AnchorProvider, AnchorProvider,
BorshAccountsCoder, BorshAccountsCoder,
Program, Program,
@ -60,9 +63,13 @@ import type {
SendOptions, SendOptions,
Transaction, Transaction,
TransactionSignature, TransactionSignature,
} from "@solana/web3.js";
import {
Keypair,
PublicKey,
TransactionMessage,
VersionedTransaction, VersionedTransaction,
} from "@solana/web3.js"; } from "@solana/web3.js";
import { Keypair, PublicKey } from "@solana/web3.js";
import { OracleJob } from "@switchboard-xyz/common"; import { OracleJob } from "@switchboard-xyz/common";
export type SendTransactionOptions = (ConfirmOptions | SendOptions) & { export type SendTransactionOptions = (ConfirmOptions | SendOptions) & {
@ -429,6 +436,53 @@ export class SwitchboardProgram {
return program; return program;
}; };
public async getGitVersion(): Promise<string> {
const messageV0 = new TransactionMessage({
payerKey: this.walletPubkey,
instructions: [
await this._program.methods.viewVersion().accounts({}).instruction(),
],
recentBlockhash: (await this.connection.getLatestBlockhash()).blockhash,
}).compileToLegacyMessage();
const simulationResult = await this.connection.simulateTransaction(
new VersionedTransaction(messageV0),
{ sigVerify: false }
);
const logs = (simulationResult.value?.logs ?? []).join("\n");
const version = extractVersion(logs);
if (version) {
return version;
}
throw new Error(
`Failed to yield the git version in the view_version simulation result`
);
}
public async getAttestationGitVersion(): Promise<string> {
const messageV0 = new TransactionMessage({
payerKey: this.walletPubkey,
instructions: [
await this._attestationProgram.methods
.viewVersion()
.accounts({})
.instruction(),
],
recentBlockhash: (await this.connection.getLatestBlockhash()).blockhash,
}).compileToLegacyMessage();
const simulationResult = await this.connection.simulateTransaction(
new VersionedTransaction(messageV0),
{ sigVerify: false }
);
const logs = (simulationResult.value?.logs ?? []).join("\n");
const version = extractVersion(logs);
if (version) {
return version;
}
throw new Error(
`Failed to yield the git version in the view_version simulation result`
);
}
/** /**
* Retrieves the Switchboard V2 Program ID for the currently connected cluster. * Retrieves the Switchboard V2 Program ID for the currently connected cluster.
* @return The PublicKey of the Switchboard V2 Program ID. * @return The PublicKey of the Switchboard V2 Program ID.
@ -1040,3 +1094,9 @@ interface AccountInfoResponse {
pubkey: PublicKey; pubkey: PublicKey;
account: AccountInfo<Buffer>; account: AccountInfo<Buffer>;
} }
function extractVersion(input: string): string | null {
const regex = /VERSION: (\S+)/;
const match = input.match(regex);
return match ? match[1] : null;
}

View File

@ -37,7 +37,9 @@ export interface ITransactionObject extends Required<TransactionObjectOptions> {
export interface TransactionObjectOptions { export interface TransactionObjectOptions {
enableDurableNonce?: boolean; enableDurableNonce?: boolean;
/** The number of lamports to affix to the transaction. */
computeUnitPrice?: number; computeUnitPrice?: number;
/** The number of compute units for the transaction. */
computeUnitLimit?: number; computeUnitLimit?: number;
} }
@ -127,7 +129,8 @@ export class TransactionObject implements ITransactionObject {
} }
const priorityTxn = TransactionObject.getComputeUnitPriceIxn( const priorityTxn = TransactionObject.getComputeUnitPriceIxn(
options?.computeUnitPrice options?.computeUnitPrice,
options?.computeUnitLimit
); );
if ( if (
priorityTxn !== undefined && priorityTxn !== undefined &&
@ -178,11 +181,18 @@ export class TransactionObject implements ITransactionObject {
} }
static getComputeUnitPriceIxn( static getComputeUnitPriceIxn(
computeUnitPrice?: number computeUnitPrice?: number, // lamports
_computeUnitLimit?: number
): TransactionInstruction | undefined { ): TransactionInstruction | undefined {
// calculatePriorityFee = 100 Lamports
// computeUnitLimit = 250,000 CUs
// lamports / CU = 100 / 250,000 = 0.0004 Lamports / CUs
// microLamports = 0.0004 * 10e6 = 4000 microLamports / CU
if (computeUnitPrice && computeUnitPrice > 0) { if (computeUnitPrice && computeUnitPrice > 0) {
return ComputeBudgetProgram.setComputeUnitPrice({ return ComputeBudgetProgram.setComputeUnitPrice({
microLamports: computeUnitPrice, microLamports: Math.round(
(computeUnitPrice / (_computeUnitLimit ?? 250000)) * 1000000
),
}); });
} }

View File

@ -33,6 +33,7 @@ import type {
TransactionPackOptions, TransactionPackOptions,
} from "../TransactionObject.js"; } from "../TransactionObject.js";
import { TransactionObject } from "../TransactionObject.js"; import { TransactionObject } from "../TransactionObject.js";
import { calculatePriorityFee } from "../utils.js";
import type { OnAccountChangeCallback } from "./account.js"; import type { OnAccountChangeCallback } from "./account.js";
import { Account } from "./account.js"; import { Account } from "./account.js";
@ -2272,32 +2273,28 @@ export class AggregatorAccount extends Account<AggregatorAccountData> {
timestamp = Math.round(Date.now() / 1000), timestamp = Math.round(Date.now() / 1000),
baseFee = 0 // base compute unit price baseFee = 0 // base compute unit price
): number { ): number {
// parse defaults const currentRoundOpenTimestamp =
aggregator.currentRound.roundOpenTimestamp.toNumber();
const latestConfirmedOpenTimestamp =
aggregator.latestConfirmedRound.roundOpenTimestamp.toNumber();
const lastUpdateTimestamp = const lastUpdateTimestamp =
aggregator.latestConfirmedRound.roundOpenTimestamp.gt(new BN(0)) latestConfirmedOpenTimestamp === 0
? aggregator.latestConfirmedRound.roundOpenTimestamp.toNumber() ? timestamp
: timestamp; // on first update this would cause max multiplier : // if we use the latest confirmed timestamp then its a race to confirm first
const priorityFeeBumpPeriod = Math.max(1, aggregator.priorityFeeBumpPeriod); // cant divide by 0 // only the first responder will be fully reimbursed for their priority fee
const maxPriorityFeeMultiplier = Math.max( aggregator.resolutionMode.kind === "ModeSlidingResolution"
1, ? Math.min(currentRoundOpenTimestamp, latestConfirmedOpenTimestamp)
: latestConfirmedOpenTimestamp;
return calculatePriorityFee(
timestamp,
lastUpdateTimestamp,
aggregator.basePriorityFee + baseFee,
aggregator.priorityFeeBump,
aggregator.priorityFeeBumpPeriod,
aggregator.maxPriorityFeeMultiplier aggregator.maxPriorityFeeMultiplier
); );
// calculate staleness multiplier
const multiplier = Math.min(
(timestamp - lastUpdateTimestamp) / priorityFeeBumpPeriod,
maxPriorityFeeMultiplier
);
const feeBump = aggregator.priorityFeeBump * multiplier;
const fee = baseFee + aggregator.basePriorityFee + feeBump;
if (Number.isNaN(fee)) {
return 0;
}
// Should we enforce some upper limit? Like 1 SOL?
// Probably not, gives MEV bots a floor
return Math.round(fee);
} }
/** Fetch the balance of an aggregator's lease */ /** Fetch the balance of an aggregator's lease */

View File

@ -609,6 +609,17 @@ export class OracleAccount extends Account<types.OracleAccountData> {
); );
if (params.unwrap) { if (params.unwrap) {
const withdrawDestination = params.withdrawAccount ?? payer;
const withdrawDestinationAccountInfo =
await this.program.connection.getAccountInfo(withdrawDestination);
if (
!withdrawDestinationAccountInfo?.owner.equals(SystemProgram.programId)
) {
throw new Error(
`'withdrawAccount' must be owned by the SystemProgram if 'unwrap' is true`
);
}
const ephemeralWallet = Keypair.generate(); const ephemeralWallet = Keypair.generate();
const ixns = [ const ixns = [
@ -654,7 +665,7 @@ export class OracleAccount extends Account<types.OracleAccountData> {
), ),
spl.createCloseAccountInstruction( spl.createCloseAccountInstruction(
ephemeralWallet.publicKey, ephemeralWallet.publicKey,
oracle.oracleAuthority, withdrawDestination,
payer payer
), ),
]; ];
@ -675,6 +686,19 @@ export class OracleAccount extends Account<types.OracleAccountData> {
? params.withdrawAccount ? params.withdrawAccount
: this.program.mint.getAssociatedAddress(payer); : this.program.mint.getAssociatedAddress(payer);
const withdrawAccountInfo = await this.program.mint.getAccount(
withdrawAccount
);
if (
!withdrawAccountInfo ||
!withdrawAccountInfo.owner.equals(spl.TOKEN_PROGRAM_ID)
) {
throw new Error(
`'withdrawAccount' must be initialized and owned by the TokenProgram if 'unwrap' is false`
);
}
const withdrawIxn = types.oracleWithdraw( const withdrawIxn = types.oracleWithdraw(
this.program, this.program,
{ {
@ -852,6 +876,8 @@ export interface OracleWithdrawBaseParams {
export interface OracleWithdrawUnwrapParams extends OracleWithdrawBaseParams { export interface OracleWithdrawUnwrapParams extends OracleWithdrawBaseParams {
unwrap: true; unwrap: true;
/** System account where the unwrapped tokens will be sent. Defaults to the payer. */
withdrawAccount?: PublicKey;
} }
export interface OracleWithdrawWalletParams extends OracleWithdrawBaseParams { export interface OracleWithdrawWalletParams extends OracleWithdrawBaseParams {

View File

@ -0,0 +1,15 @@
import type { SwitchboardProgram } from "../../../SwitchboardProgram.js";
import * as types from "../types/index.js"; // eslint-disable-line @typescript-eslint/no-unused-vars
import * as borsh from "@coral-xyz/borsh"; // eslint-disable-line @typescript-eslint/no-unused-vars
import type { AccountMeta, PublicKey } from "@solana/web3.js";
import { TransactionInstruction } from "@solana/web3.js"; // eslint-disable-line @typescript-eslint/no-unused-vars
import { BN } from "@switchboard-xyz/common"; // eslint-disable-line @typescript-eslint/no-unused-vars
export function viewVersion(programId: PublicKey) {
const keys: Array<AccountMeta> = [];
const identifier = Buffer.from([213, 222, 182, 245, 222, 107, 62, 71]);
const data = identifier;
const ix = new TransactionInstruction({ keys, programId, data });
return ix;
}

View File

@ -160,6 +160,7 @@ export type {
VaultTransferArgs, VaultTransferArgs,
} from "./vaultTransfer.js"; } from "./vaultTransfer.js";
export { vaultTransfer } from "./vaultTransfer.js"; export { vaultTransfer } from "./vaultTransfer.js";
export { viewVersion } from "./viewVersion.js";
export type { export type {
VrfCloseActionAccounts, VrfCloseActionAccounts,
VrfCloseActionArgs, VrfCloseActionArgs,

View File

@ -0,0 +1,15 @@
import type { SwitchboardProgram } from "../../../SwitchboardProgram.js";
import * as types from "../types/index.js"; // eslint-disable-line @typescript-eslint/no-unused-vars
import * as borsh from "@coral-xyz/borsh"; // eslint-disable-line @typescript-eslint/no-unused-vars
import type { AccountMeta, PublicKey } from "@solana/web3.js";
import { TransactionInstruction } from "@solana/web3.js"; // eslint-disable-line @typescript-eslint/no-unused-vars
import { BN } from "@switchboard-xyz/common"; // eslint-disable-line @typescript-eslint/no-unused-vars
export function viewVersion(programId: PublicKey) {
const keys: Array<AccountMeta> = [];
const identifier = Buffer.from([213, 222, 182, 245, 222, 107, 62, 71]);
const data = identifier;
const ix = new TransactionInstruction({ keys, programId, data });
return ix;
}

View File

@ -278,3 +278,31 @@ export function numToBN(num?: number | BN, defaultVal = 0): BN {
return num; return num;
} }
export function calculatePriorityFee(
timestamp: number,
roundOpenTimestamp: number,
basePriorityFee: number,
priorityFeeBump: number,
priorityFeeBumpPeriod: number,
maxPriorityFeeMultiplier: number
): number {
if (priorityFeeBumpPeriod <= 0) {
return basePriorityFee;
}
if (maxPriorityFeeMultiplier <= 0) {
return basePriorityFee;
}
const staleness = Math.round(timestamp - roundOpenTimestamp);
if (staleness <= 0) {
return basePriorityFee;
}
const feeMultiplier = Math.floor(staleness / priorityFeeBumpPeriod) - 1;
const multiplier =
feeMultiplier > 0 ? Math.min(feeMultiplier, maxPriorityFeeMultiplier) : 0;
return Math.floor(priorityFeeBump * multiplier + basePriorityFee);
}

View File

@ -1,85 +1,48 @@
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
import "mocha"; import "mocha";
import { AggregatorAccount, types } from "../src/index.js"; import { calculatePriorityFee } from "../src/index.js";
import { BN } from "@switchboard-xyz/common";
import assert from "assert"; import assert from "assert";
describe("Priority Fees Tests", () => { describe("Priority Fees Tests", () => {
const defaultState = AggregatorAccount.default(); it("Calculates priority fee with empty values", async () => {
const fee = calculatePriorityFee(10000000, 0, 0, 0, 0, 0);
const startingTimestamp = 100; assert(fee === 0, "PriorityFeeMismatch");
const basePriorityFee = 1000; // always bump fee by 1000 lamports
const priorityFeeBump = 500; // bump fee by 500 lamports for every period the feed is stale
const priorityFeeBumpPeriod = 30; // bump fee by priorityFeeBump every 30s
const maxPriorityFeeMultiplier = 10; // the max fee multiplier is 10 * 500 lamports
const aggregatorFields: types.AggregatorAccountDataFields = {
...defaultState,
basePriorityFee: basePriorityFee,
priorityFeeBump: priorityFeeBump,
priorityFeeBumpPeriod: priorityFeeBumpPeriod,
maxPriorityFeeMultiplier: maxPriorityFeeMultiplier,
latestConfirmedRound: {
...defaultState.latestConfirmedRound,
roundOpenTimestamp: new BN(startingTimestamp),
},
};
const aggregator = new types.AggregatorAccountData(aggregatorFields);
it("Calculates the priority fee with no staleness", async () => {
// no staleness
const noStalenessFee = AggregatorAccount.calculatePriorityFee(
aggregator,
startingTimestamp
);
const expectedNoStalenessFee = Math.round(basePriorityFee);
assert(
expectedNoStalenessFee === noStalenessFee,
`priorityFee mismatch with no staleness, expected ${expectedNoStalenessFee}, received ${noStalenessFee}`
);
}); });
it("Calculates the priority fee with staleness multiplier", async () => { it("Calculates priority fee with empty max multiplier", async () => {
// with staleness const fee = calculatePriorityFee(10_500, 10_000, 100, 10, 60, 0);
const multipliers = [0.5, 1, 1.33333, 1.8323232, 2, 5, 10]; assert(fee === 100, "PriorityFeeMismatch");
for (const multiplier of multipliers) {
const priorityFee = AggregatorAccount.calculatePriorityFee(
aggregator,
startingTimestamp + multiplier * priorityFeeBumpPeriod
);
const expectedPriorityFee = Math.round(
basePriorityFee + multiplier * priorityFeeBump
);
assert(
expectedPriorityFee === priorityFee,
`priorityFee mismatch for multiplier ${multiplier}, expected ${expectedPriorityFee}, received ${priorityFee}`
);
}
}); });
it("Calculates the priority fee with max multiplier", async () => { it("Calculates priority fee with empty bump period", async () => {
// with max multiplier const fee = calculatePriorityFee(10_500, 10_000, 100, 10, 0, 10);
const expectedPriorityFee = Math.round( assert(fee === 100, "PriorityFeeMismatch");
basePriorityFee + maxPriorityFeeMultiplier * priorityFeeBump });
); // should never exceed this
const multipliers = [ it("Calculates priority fee when not stale", async () => {
maxPriorityFeeMultiplier + 1, const fee = calculatePriorityFee(10_500, 10_500, 100, 10, 60, 10);
maxPriorityFeeMultiplier * 2, assert(fee === 100, "PriorityFeeMismatch");
maxPriorityFeeMultiplier * 10, });
];
for (const multiplier of multipliers) { it("Calculates priority fee when barely stale", async () => {
const priorityFee = AggregatorAccount.calculatePriorityFee( const fee = calculatePriorityFee(10_510, 10_500, 100, 10, 60, 10);
aggregator, assert(fee === 100, "PriorityFeeMismatch");
startingTimestamp + multiplier * priorityFeeBumpPeriod });
);
assert( it("Calculates priority fee when stale for 1 period", async () => {
expectedPriorityFee === priorityFee, const fee = calculatePriorityFee(10_621, 10_500, 100, 10, 60, 10);
`priorityFee mismatch for max multiplier, expected ${expectedPriorityFee}, received ${priorityFee}` assert(fee === 110, "PriorityFeeMismatch");
); });
}
it("Calculates priority fee when stale for 5 periods", async () => {
const fee = calculatePriorityFee(10_861, 10_500, 100, 10, 60, 10);
assert(fee === 150, "PriorityFeeMismatch");
});
it("Calculates priority fee when max multiplier exceeded", async () => {
const fee = calculatePriorityFee(10_861, 0, 100, 10, 60, 10);
assert(fee === 200, "PriorityFeeMismatch");
}); });
}); });

View File

@ -0,0 +1,25 @@
/* eslint-disable no-unused-vars */
import "mocha";
import type { TestContext } from "./utils.js";
import { setupTest } from "./utils.js";
import assert from "assert";
describe("Git Version Tests", () => {
let ctx: TestContext;
before(async () => {
ctx = await setupTest();
});
it("Gets the oracle program's git version", async () => {
const version = await ctx.program.getGitVersion();
console.log(`Oracle Version: ${version}`);
});
it("Gets the attestation program's git version", async () => {
const version = await ctx.program.getAttestationGitVersion();
console.log(`Attestation Version: ${version}`);
});
});

View File

@ -63,13 +63,13 @@ importers:
specifier: ^1.78.3 specifier: ^1.78.3
version: 1.78.3 version: 1.78.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.78.3) version: 2.3.4
'@switchboard-xyz/oracle': '@switchboard-xyz/oracle':
specifier: latest specifier: latest
version: 2.1.13 version: 2.1.13
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
chalk: chalk:
specifier: ^4.1.2 specifier: ^4.1.2
@ -112,13 +112,13 @@ importers:
specifier: ^1.77.3 specifier: ^1.77.3
version: 1.77.3 version: 1.77.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.77.3) version: 2.3.4
'@switchboard-xyz/oracle': '@switchboard-xyz/oracle':
specifier: latest specifier: latest
version: 2.1.13 version: 2.1.13
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
devDependencies: devDependencies:
'@types/chai': '@types/chai':
@ -143,13 +143,13 @@ importers:
specifier: ^0.28.0 specifier: ^0.28.0
version: 0.28.0 version: 0.28.0
'@solana/spl-token': '@solana/spl-token':
specifier: ^0.3.8 specifier: ^0.3.6
version: 0.3.8(@solana/web3.js@1.78.4) version: 0.3.8(@solana/web3.js@1.78.3)
'@solana/web3.js': '@solana/web3.js':
specifier: ^1.78.4 specifier: ^1.78.0
version: 1.78.4 version: 1.78.3
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
devDependencies: devDependencies:
'@types/bn.js': '@types/bn.js':
@ -192,10 +192,10 @@ importers:
specifier: ^1.78.3 specifier: ^1.78.3
version: 1.78.3 version: 1.78.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.78.3) version: 2.3.4
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
devDependencies: devDependencies:
'@types/bn.js': '@types/bn.js':
@ -238,10 +238,10 @@ importers:
specifier: ^1.78.3 specifier: ^1.78.3
version: 1.78.3 version: 1.78.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.78.3) version: 2.3.4
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
devDependencies: devDependencies:
'@types/bn.js': '@types/bn.js':
@ -284,10 +284,10 @@ importers:
specifier: ^1.78.3 specifier: ^1.78.3
version: 1.78.3 version: 1.78.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.78.3) version: 2.3.4
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
dotenv: dotenv:
specifier: ^16.3.1 specifier: ^16.3.1
@ -326,10 +326,10 @@ importers:
specifier: ^0.28.0 specifier: ^0.28.0
version: 0.28.0 version: 0.28.0
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.78.4) version: 2.3.4
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
devDependencies: devDependencies:
'@types/bn.js': '@types/bn.js':
@ -378,13 +378,13 @@ importers:
specifier: ^1.77.3 specifier: ^1.77.3
version: 1.77.3 version: 1.77.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.4
version: 2.3.2(@solana/web3.js@1.77.3) version: 2.3.4
'@switchboard-xyz/oracle': '@switchboard-xyz/oracle':
specifier: latest specifier: latest
version: 2.1.13 version: 2.1.13
'@switchboard-xyz/solana.js': '@switchboard-xyz/solana.js':
specifier: ^2.5.4 specifier: ^2.5.6
version: link:../../../javascript/solana.js version: link:../../../javascript/solana.js
chalk: chalk:
specifier: ^4.1.2 specifier: ^4.1.2
@ -476,8 +476,8 @@ importers:
specifier: ^1.78.3 specifier: ^1.78.3
version: 1.78.3 version: 1.78.3
'@switchboard-xyz/common': '@switchboard-xyz/common':
specifier: ^2.3.2 specifier: ^2.3.3
version: 2.3.2(@solana/web3.js@1.78.3) version: 2.3.3(@solana/web3.js@1.78.3)
cron-validator: cron-validator:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1 version: 1.3.1
@ -1023,6 +1023,7 @@ packages:
'@solana/web3.js': 1.78.4 '@solana/web3.js': 1.78.4
bn.js: 5.2.1 bn.js: 5.2.1
buffer-layout: 1.2.2 buffer-layout: 1.2.2
dev: true
/@cspotcode/source-map-support@0.8.1: /@cspotcode/source-map-support@0.8.1:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@ -1543,22 +1544,6 @@ packages:
- utf-8-validate - utf-8-validate
dev: false dev: false
/@solana/spl-token@0.3.8(@solana/web3.js@1.78.4):
resolution: {integrity: sha512-ogwGDcunP9Lkj+9CODOWMiVJEdRtqHAtX2rWF62KxnnSWtMZtV9rDhTrZFshiyJmxDnRL/1nKE1yJHg4jjs3gg==}
engines: {node: '>=16'}
peerDependencies:
'@solana/web3.js': ^1.47.4
dependencies:
'@solana/buffer-layout': 4.0.0
'@solana/buffer-layout-utils': 0.2.0
'@solana/web3.js': 1.78.4
buffer: 6.0.3
transitivePeerDependencies:
- bufferutil
- encoding
- utf-8-validate
dev: false
/@solana/web3.js@1.77.3: /@solana/web3.js@1.77.3:
resolution: {integrity: sha512-PHaO0BdoiQRPpieC1p31wJsBaxwIOWLh8j2ocXNKX8boCQVldt26Jqm2tZE4KlrvnCIV78owPLv1pEUgqhxZ3w==} resolution: {integrity: sha512-PHaO0BdoiQRPpieC1p31wJsBaxwIOWLh8j2ocXNKX8boCQVldt26Jqm2tZE4KlrvnCIV78owPLv1pEUgqhxZ3w==}
dependencies: dependencies:
@ -1630,26 +1615,8 @@ packages:
- encoding - encoding
- utf-8-validate - utf-8-validate
/@switchboard-xyz/common@2.3.2(@solana/web3.js@1.77.3): /@switchboard-xyz/common@2.3.3(@solana/web3.js@1.78.3):
resolution: {integrity: sha512-Vv/Som+QmOOpbvCTWO/FwJ9Bz6yYqBbLqo9T5UuO2JHqL/pBcvTrJGK2ERizTv3UEuHF7Z6zl0k/rdN+11hnyw==} resolution: {integrity: sha512-aZK6Wbu1khMn0qRr0viOwCVcDluS3BzvdoQflmmmCMuEpltDgd7vF/Ax4k+z/9EM54jdqwJRPnAKBDni1RpLyA==}
engines: {node: '>=12'}
dependencies:
'@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.77.3)
'@types/big.js': 6.1.6
'@types/bn.js': 5.1.1
big.js: 6.2.1
bn.js: 5.2.1
bs58: 5.0.0
decimal.js: 10.4.3
lodash: 4.17.21
protobufjs: 7.2.4
yaml: 2.2.1
transitivePeerDependencies:
- '@solana/web3.js'
dev: false
/@switchboard-xyz/common@2.3.2(@solana/web3.js@1.78.3):
resolution: {integrity: sha512-Vv/Som+QmOOpbvCTWO/FwJ9Bz6yYqBbLqo9T5UuO2JHqL/pBcvTrJGK2ERizTv3UEuHF7Z6zl0k/rdN+11hnyw==}
engines: {node: '>=12'} engines: {node: '>=12'}
dependencies: dependencies:
'@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.78.3) '@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.78.3)
@ -1666,13 +1633,10 @@ packages:
- '@solana/web3.js' - '@solana/web3.js'
dev: false dev: false
/@switchboard-xyz/common@2.3.2(@solana/web3.js@1.78.4): /@switchboard-xyz/common@2.3.4:
resolution: {integrity: sha512-Vv/Som+QmOOpbvCTWO/FwJ9Bz6yYqBbLqo9T5UuO2JHqL/pBcvTrJGK2ERizTv3UEuHF7Z6zl0k/rdN+11hnyw==} resolution: {integrity: sha512-9ewK3aQxV8P/OgNjCw2fq5SRm+JLK1sf/+vlTozDK4bb9PwaISHZ08QP7IZ7eCZ+Af69X3eFvxeYh3HDfSzlwg==}
engines: {node: '>=12'} engines: {node: '>=12'}
dependencies: dependencies:
'@coral-xyz/borsh': 0.28.0(@solana/web3.js@1.78.4)
'@types/big.js': 6.1.6
'@types/bn.js': 5.1.1
big.js: 6.2.1 big.js: 6.2.1
bn.js: 5.2.1 bn.js: 5.2.1
bs58: 5.0.0 bs58: 5.0.0
@ -1680,19 +1644,17 @@ packages:
lodash: 4.17.21 lodash: 4.17.21
protobufjs: 7.2.4 protobufjs: 7.2.4
yaml: 2.2.1 yaml: 2.2.1
transitivePeerDependencies:
- '@solana/web3.js'
dev: false dev: false
/@switchboard-xyz/eslint-config@0.1.9: /@switchboard-xyz/eslint-config@0.1.9:
resolution: {integrity: sha512-ZvCAsXn4NsBCECWvew/GIrkvDGzPhhDzT77jkEKQ7Xd2ftrjFJOeYoREDQIOhD88uN3qBl0cIKHbS4t0amkzGw==} resolution: {integrity: sha512-ZvCAsXn4NsBCECWvew/GIrkvDGzPhhDzT77jkEKQ7Xd2ftrjFJOeYoREDQIOhD88uN3qBl0cIKHbS4t0amkzGw==}
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 6.4.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6) '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6)
'@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.0.4)
'@typescript-eslint/type-utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6)
eslint: 8.47.0 eslint: 8.47.0
eslint-config-prettier: 9.0.0(eslint@8.47.0) eslint-config-prettier: 9.0.0(eslint@8.47.0)
eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.0)(eslint@8.47.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)
eslint-plugin-node: 11.1.0(eslint@8.47.0) eslint-plugin-node: 11.1.0(eslint@8.47.0)
eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@2.8.8) eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@2.8.8)
eslint-plugin-simple-import-sort: 10.0.0(eslint@8.47.0) eslint-plugin-simple-import-sort: 10.0.0(eslint@8.47.0)
@ -1899,8 +1861,8 @@ packages:
'@types/node': 20.4.2 '@types/node': 20.4.2
optional: true optional: true
/@typescript-eslint/eslint-plugin@6.4.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.1.6): /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6):
resolution: {integrity: sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==} resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
@ -1911,11 +1873,11 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@eslint-community/regexpp': 4.6.2 '@eslint-community/regexpp': 4.6.2
'@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.0.4)
'@typescript-eslint/scope-manager': 6.4.0 '@typescript-eslint/scope-manager': 6.4.1
'@typescript-eslint/type-utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6)
'@typescript-eslint/utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6)
'@typescript-eslint/visitor-keys': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.1
debug: 4.3.4(supports-color@8.1.1) debug: 4.3.4(supports-color@8.1.1)
eslint: 8.47.0 eslint: 8.47.0
graphemer: 1.4.0 graphemer: 1.4.0
@ -1928,8 +1890,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/parser@6.4.0(eslint@8.47.0)(typescript@5.0.4): /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.0.4):
resolution: {integrity: sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==} resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
@ -1938,10 +1900,10 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/scope-manager': 6.4.0 '@typescript-eslint/scope-manager': 6.4.1
'@typescript-eslint/types': 6.4.0 '@typescript-eslint/types': 6.4.1
'@typescript-eslint/typescript-estree': 6.4.0(typescript@5.0.4) '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.0.4)
'@typescript-eslint/visitor-keys': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.1
debug: 4.3.4(supports-color@8.1.1) debug: 4.3.4(supports-color@8.1.1)
eslint: 8.47.0 eslint: 8.47.0
typescript: 5.0.4 typescript: 5.0.4
@ -1949,16 +1911,16 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/scope-manager@6.4.0: /@typescript-eslint/scope-manager@6.4.1:
resolution: {integrity: sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==} resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 6.4.0 '@typescript-eslint/types': 6.4.1
'@typescript-eslint/visitor-keys': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.1
dev: true dev: true
/@typescript-eslint/type-utils@6.4.0(eslint@8.47.0)(typescript@5.1.6): /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.1.6):
resolution: {integrity: sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==} resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
@ -1967,8 +1929,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 6.4.0(typescript@5.1.6) '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6)
'@typescript-eslint/utils': 6.4.0(eslint@8.47.0)(typescript@5.1.6) '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6)
debug: 4.3.4(supports-color@8.1.1) debug: 4.3.4(supports-color@8.1.1)
eslint: 8.47.0 eslint: 8.47.0
ts-api-utils: 1.0.1(typescript@5.1.6) ts-api-utils: 1.0.1(typescript@5.1.6)
@ -1977,13 +1939,13 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/types@6.4.0: /@typescript-eslint/types@6.4.1:
resolution: {integrity: sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==} resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
dev: true dev: true
/@typescript-eslint/typescript-estree@6.4.0(typescript@5.0.4): /@typescript-eslint/typescript-estree@6.4.1(typescript@5.0.4):
resolution: {integrity: sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==} resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -1991,8 +1953,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/types': 6.4.0 '@typescript-eslint/types': 6.4.1
'@typescript-eslint/visitor-keys': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.1
debug: 4.3.4(supports-color@8.1.1) debug: 4.3.4(supports-color@8.1.1)
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@ -2003,8 +1965,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/typescript-estree@6.4.0(typescript@5.1.6): /@typescript-eslint/typescript-estree@6.4.1(typescript@5.1.6):
resolution: {integrity: sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==} resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -2012,8 +1974,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/types': 6.4.0 '@typescript-eslint/types': 6.4.1
'@typescript-eslint/visitor-keys': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.1
debug: 4.3.4(supports-color@8.1.1) debug: 4.3.4(supports-color@8.1.1)
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@ -2024,8 +1986,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/utils@6.4.0(eslint@8.47.0)(typescript@5.1.6): /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.1.6):
resolution: {integrity: sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==} resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 eslint: ^7.0.0 || ^8.0.0
@ -2033,9 +1995,9 @@ packages:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@types/json-schema': 7.0.12 '@types/json-schema': 7.0.12
'@types/semver': 7.5.0 '@types/semver': 7.5.0
'@typescript-eslint/scope-manager': 6.4.0 '@typescript-eslint/scope-manager': 6.4.1
'@typescript-eslint/types': 6.4.0 '@typescript-eslint/types': 6.4.1
'@typescript-eslint/typescript-estree': 6.4.0(typescript@5.1.6) '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6)
eslint: 8.47.0 eslint: 8.47.0
semver: 7.5.4 semver: 7.5.4
transitivePeerDependencies: transitivePeerDependencies:
@ -2043,11 +2005,11 @@ packages:
- typescript - typescript
dev: true dev: true
/@typescript-eslint/visitor-keys@6.4.0: /@typescript-eslint/visitor-keys@6.4.1:
resolution: {integrity: sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==} resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 6.4.0 '@typescript-eslint/types': 6.4.1
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
dev: true dev: true
@ -3169,7 +3131,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0): /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0):
resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@ -3190,7 +3152,7 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.0.4)
debug: 3.2.7 debug: 3.2.7
eslint: 8.47.0 eslint: 8.47.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
@ -3209,7 +3171,7 @@ packages:
regexpp: 3.2.0 regexpp: 3.2.0
dev: true dev: true
/eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.0)(eslint@8.47.0): /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0):
resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@ -3219,7 +3181,7 @@ packages:
'@typescript-eslint/parser': '@typescript-eslint/parser':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.0.4) '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.0.4)
array-includes: 3.1.6 array-includes: 3.1.6
array.prototype.findlastindex: 1.2.2 array.prototype.findlastindex: 1.2.2
array.prototype.flat: 1.3.1 array.prototype.flat: 1.3.1
@ -3228,7 +3190,7 @@ packages:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 8.47.0 eslint: 8.47.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0) eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.7)(eslint@8.47.0)
has: 1.0.3 has: 1.0.3
is-core-module: 2.13.0 is-core-module: 2.13.0
is-glob: 4.0.3 is-glob: 4.0.3
@ -4837,7 +4799,7 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dependencies: dependencies:
hosted-git-info: 4.1.0 hosted-git-info: 4.1.0
is-core-module: 2.12.1 is-core-module: 2.13.0
semver: 7.5.4 semver: 7.5.4
validate-npm-package-license: 3.0.4 validate-npm-package-license: 3.0.4
dev: true dev: true

View File

@ -4249,7 +4249,7 @@ dependencies = [
[[package]] [[package]]
name = "switchboard-solana" name = "switchboard-solana"
version = "0.28.5" version = "0.28.6"
dependencies = [ dependencies = [
"anchor-client", "anchor-client",
"anchor-lang", "anchor-lang",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "switchboard-solana" name = "switchboard-solana"
version = "0.28.5" version = "0.28.6"
edition = "2021" edition = "2021"
description = "A Rust library to interact with Switchboard accounts." description = "A Rust library to interact with Switchboard accounts."
readme = "README.md" readme = "README.md"
@ -47,4 +47,4 @@ tokio = "1"
url = "2.4" url = "2.4"
[package.metadata.docs.rs] [package.metadata.docs.rs]
rustdoc-args = ["--cfg", "doc_cfg"] rustdoc-args = ["--cfg", "doc_cfg"]

View File

@ -57,7 +57,7 @@ impl FunctionRunner {
let signer = signer_to_pubkey(signer_keypair.clone())?; let signer = signer_to_pubkey(signer_keypair.clone())?;
let env = SolanaFunctionEnvironment::parse()?; let env = SolanaFunctionEnvironment::parse()?;
msg!("ENV: {:?}", env); msg!("ENV: {:#?}", env);
// required to run // required to run
let function = Pubkey::from_str(&env.function_key).unwrap(); let function = Pubkey::from_str(&env.function_key).unwrap();
@ -175,8 +175,7 @@ impl FunctionRunner {
} }
pub fn from_env(commitment: Option<CommitmentConfig>) -> Result<Self, SwitchboardClientError> { pub fn from_env(commitment: Option<CommitmentConfig>) -> Result<Self, SwitchboardClientError> {
let cluster = Cluster::from_str(&std::env::var("CLUSTER").unwrap_or("devnet".to_string())) let cluster = Cluster::from_str(&std::env::var("CLUSTER").unwrap()).unwrap();
.unwrap_or(Cluster::Devnet);
Self::new_from_cluster(cluster, commitment) Self::new_from_cluster(cluster, commitment)
} }
@ -550,4 +549,4 @@ impl ToAccountMetas for FunctionRequestVerifyAccounts {
AccountMeta::new_readonly(anchor_spl::token::ID, false), AccountMeta::new_readonly(anchor_spl::token::ID, false),
] ]
} }
} }