diff --git a/package.json b/package.json index 4ea74eabc..b44994d67 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "@solana/spl-token": "0.3.7", "@solana/web3.js": "^1.78.2", "@switchboard-xyz/common": "^2.4.2", - "@switchboard-xyz/on-demand": "^1.1.34", + "@switchboard-xyz/on-demand": "^1.2.15", "@switchboard-xyz/sbv2-lite": "^0.1.6", "@switchboard-xyz/solana.js": "^2.5.4", "big.js": "^6.1.1", @@ -86,7 +86,7 @@ "fast-copy": "^3.0.1", "lodash": "^4.17.21", "node-kraken-api": "^2.2.2", - "switchboard-anchor": "npm:@coral-xyz/anchor@0.30.0" + "switchboard-anchor": "npm:@coral-xyz/anchor@0.30.1" }, "resolutions": { "**/@solana/web3.js/node-fetch": "npm:@blockworks-foundation/node-fetch@2.6.11", diff --git a/ts/client/scripts/maintain-alts.ts b/ts/client/scripts/maintain-alts.ts index 1d00d4e7a..cd58d2e62 100644 --- a/ts/client/scripts/maintain-alts.ts +++ b/ts/client/scripts/maintain-alts.ts @@ -11,11 +11,19 @@ import { Connection, Keypair, PublicKey, - SYSVAR_INSTRUCTIONS_PUBKEY, SystemProgram, + SYSVAR_INSTRUCTIONS_PUBKEY, } from '@solana/web3.js'; +import { + fetchAllLutKeys, + ON_DEMAND_MAINNET_QUEUE, + PullFeed, + Queue, + SB_ON_DEMAND_PID, +} from '@switchboard-xyz/on-demand'; import fs from 'fs'; import chunk from 'lodash/chunk'; +import { Program as Anchor30Program } from 'switchboard-anchor'; import { Group } from '../src/accounts/group'; import { MangoClient } from '../src/client'; import { @@ -28,6 +36,29 @@ import { buildVersionedTx } from '../src/utils'; const { MB_CLUSTER_URL, MB_PAYER3_KEYPAIR, DRY_RUN } = process.env; const CLUSTER: Cluster = (process.env.CLUSTER as Cluster) || 'mainnet-beta'; +async function buildSbOnDemandAccountsForAlts( + connection: Connection, +): Promise { + const userProvider = new AnchorProvider( + connection, + new Wallet(Keypair.generate()), + AnchorProvider.defaultOptions(), + ); + const idl = await Anchor30Program.fetchIdl(SB_ON_DEMAND_PID, userProvider); + const sbOnDemandProgram = new Anchor30Program(idl!, userProvider); + + return await fetchAllLutKeys( + new Queue(sbOnDemandProgram, new PublicKey(ON_DEMAND_MAINNET_QUEUE)), + // TODO replace with oracles which are derived from the group + [ + '2A7aqNLy26ZBSMWP2Ekxv926hj16tCA47W1sHWVqaLii', // digitSOL + 'AZcoqpWhMJUaKEDUfKsfzCr3Y96gSQwv43KSQ6KpeyQ1', // INF + ].map((oracle) => { + return new PullFeed(sbOnDemandProgram, new PublicKey(oracle)); + }), + ); +} + // eslint-disable-next-line no-inner-declarations async function extendTable( client: MangoClient, @@ -72,7 +103,7 @@ async function extendTable( } else { if (altIndex == altAddresses.length - 1) { console.log( - `...need to create a new alt, all existing ones are full`, + `...need to create a new alt, all existing ones are full, ${nick}`, ); process.exit(-1); } @@ -105,8 +136,10 @@ async function extendTable( if (DRY_RUN) { continue; } - const sig = - await client.program.provider.connection.sendTransaction(extendTx); + const sig = await client.program.provider.connection.sendTransaction( + extendTx, + { skipPreflight: true }, + ); console.log(`https://explorer.solana.com/tx/${sig}`); } } @@ -124,7 +157,7 @@ async function createANewAlt() { CLUSTER, MANGO_V4_ID[CLUSTER], { - idsSource: 'get-program-accounts', + idsSource: 'api', }, ); @@ -137,7 +170,9 @@ async function createANewAlt() { client.program.provider as AnchorProvider, [createIx[0]], ); - const sig = await connection.sendTransaction(createTx); + const sig = await connection.sendTransaction(createTx, { + skipPreflight: true, + }); console.log( `...created ALT ${createIx[1]} https://explorer.solana.com/tx/${sig}`, ); @@ -157,7 +192,7 @@ async function populateExistingAlts(): Promise { CLUSTER, MANGO_V4_ID[CLUSTER], { - idsSource: 'get-program-accounts', + idsSource: 'api', }, ); const group = await client.getGroup(MANGO_V4_MAIN_GROUP); @@ -169,13 +204,16 @@ async function populateExistingAlts(): Promise { const altAddress0 = new PublicKey( 'AgCBUZ6UMWqPLftTxeAqpQxtrfiCyL2HgRfmmM6QTfCj', ); + const altAddress11 = new PublicKey( + '5iCJfe8RqQ3DFeP8uHXYe8Q6hFPYVh8PfBX7rU9ydC99', + ); // group and insurance vault await extendTable( client, group, payer, 'group', - [altAddress0], + [altAddress0, altAddress11], [group.publicKey, group.insuranceVault], ); // Banks + vaults + oracles @@ -185,7 +223,7 @@ async function populateExistingAlts(): Promise { group, payer, 'token banks', - [altAddress0], + [altAddress0, altAddress11], Array.from(group.banksMapByMint.values()) .flat() .map((bank) => bank.publicKey), @@ -195,7 +233,7 @@ async function populateExistingAlts(): Promise { group, payer, 'token bank oracles', - [altAddress0], + [altAddress0, altAddress11], Array.from(group.banksMapByMint.values()) .flat() .map((bank) => bank.oracle), @@ -205,7 +243,7 @@ async function populateExistingAlts(): Promise { group, payer, 'token bank vaults', - [altAddress0], + [altAddress0, altAddress11], Array.from(group.banksMapByMint.values()) .flat() .map((bank) => bank.vault), @@ -216,7 +254,7 @@ async function populateExistingAlts(): Promise { group, payer, 'perp markets and perp oracles', - [altAddress0], + [altAddress0, altAddress11], Array.from(group.perpMarketsMapByMarketIndex.values()) .flat() .map((perpMarket) => [perpMarket.publicKey, perpMarket.oracle]) @@ -228,7 +266,7 @@ async function populateExistingAlts(): Promise { group, payer, 'well known addresses', - [altAddress0], + [altAddress0, altAddress11], [ // Solana specific SystemProgram.programId, @@ -255,13 +293,16 @@ async function populateExistingAlts(): Promise { const altAddress3 = new PublicKey( '2JAg3Rm6TmQ3gSYgUCCyZ9bCQKThD9jxHCN6U2ByTPMb', ); + const altAddress4 = new PublicKey( + 'BaoRgLAykJovr2Y7BgtPg7rDmkvyp6sG59uJx5wzXTZE', + ); // bank mints await extendTable( client, group, payer, 'token mints', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.banksMapByMint.values()) .flat() .map((bank) => [bank.mint]) @@ -273,7 +314,7 @@ async function populateExistingAlts(): Promise { group, payer, 'mint infos', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.mintInfosMapByMint.values()) .flat() .map((mintInto) => [mintInto.publicKey]) @@ -286,7 +327,7 @@ async function populateExistingAlts(): Promise { group, payer, 'serum3 markets', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.serum3MarketsMapByMarketIndex.values()) .flat() .map((serum3Market) => serum3Market.publicKey), @@ -296,7 +337,7 @@ async function populateExistingAlts(): Promise { group, payer, 'serum3 external markets', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.serum3ExternalMarketsMap.values()) .flat() .map((serum3ExternalMarket) => serum3ExternalMarket.publicKey), @@ -306,7 +347,7 @@ async function populateExistingAlts(): Promise { group, payer, 'serum3 external markets bids', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.serum3ExternalMarketsMap.values()) .flat() .map((serum3ExternalMarket) => serum3ExternalMarket.bidsAddress), @@ -316,7 +357,7 @@ async function populateExistingAlts(): Promise { group, payer, 'serum3 external markets asks', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.serum3ExternalMarketsMap.values()) .flat() .map((serum3ExternalMarket) => serum3ExternalMarket.asksAddress), @@ -326,7 +367,7 @@ async function populateExistingAlts(): Promise { group, payer, 'perp market event queues, bids, and asks', - [altAddress1, altAddress2, altAddress3], + [altAddress1, altAddress2, altAddress3, altAddress4], Array.from(group.perpMarketsMapByMarketIndex.values()) .flat() .map((perpMarket) => [ @@ -336,6 +377,18 @@ async function populateExistingAlts(): Promise { ]) .flat(), ); + + const altAddress21 = new PublicKey( + 'BeJQmG5CC4XFc24StGjrE5tD7xbU1mYaofvXu2NiPxaT', + ); + await extendTable( + client, + group, + payer, + 'sb on demand oracles', + [altAddress21], + await buildSbOnDemandAccountsForAlts(connection), + ); } catch (error) { console.log(error); } diff --git a/ts/client/scripts/template.ts b/ts/client/scripts/template.ts index 3ee792d81..68515b529 100644 --- a/ts/client/scripts/template.ts +++ b/ts/client/scripts/template.ts @@ -1,6 +1,4 @@ import { PublicKey } from '@solana/web3.js'; -import { SB_ON_DEMAND_PID } from '@switchboard-xyz/on-demand'; -import { isSwitchboardOracle } from '../src/accounts/oracle'; import { MangoClient } from '../src/client'; async function main(): Promise { @@ -20,9 +18,15 @@ async function main(): Promise { (item) => item[1] instanceof PublicKey && !item[1].equals(PublicKey.default), ), + ) + .concat( + Array.from(group.perpMarketsMapByName.values()) + .flat() + .map((pm) => [pm.name, pm.oracle]), ); const oraclePublicKeys = allOracles.map((item) => item[1] as PublicKey); + const ais = await client.program.provider.connection.getMultipleAccountsInfo( oraclePublicKeys, @@ -30,13 +34,10 @@ async function main(): Promise { const result = ais .map((ai, idx) => { - return [ - isSwitchboardOracle(ai!) && !ai?.owner.equals(SB_ON_DEMAND_PID), - allOracles[idx], - ]; + return [ai!.data.readUInt32LE(0) === 2712847316, allOracles[idx]]; }) .filter((item) => item[0]) - .map((item) => item[1]); + .map((item) => item[1].toString()); console.log(result); } diff --git a/ts/client/src/accounts/group.ts b/ts/client/src/accounts/group.ts index 96015d4d0..c9db23a13 100644 --- a/ts/client/src/accounts/group.ts +++ b/ts/client/src/accounts/group.ts @@ -85,6 +85,7 @@ export class Group { new Map(), // banksMapByName new Map(), // banksMapByMint new Map(), // banksMapByTokenIndex + new Map(), // banksMapByOracle new Map(), // serum3MarketsMapByExternal new Map(), // serum3MarketsMapByMarketIndex new Map(), // serum3MarketExternalsMap @@ -95,6 +96,7 @@ export class Group { new Map(), // mintInfosMapByMint new Map(), // vaultAmountsMap [], + -1, ); } @@ -125,6 +127,8 @@ export class Group { public banksMapByName: Map, public banksMapByMint: Map, public banksMapByTokenIndex: Map, + // note: we could sometimes use same oracle for multiple banks e.g. dai/chai + public banksMapByOracle: Map, public serum3MarketsMapByExternal: Map, public serum3MarketsMapByMarketIndex: Map, public serum3ExternalMarketsMap: Map, @@ -135,6 +139,7 @@ export class Group { public mintInfosMapByMint: Map, public vaultAmountsMap: Map, public pis: PriceImpact[], + public groupLastUpdatedSlot: number, ) {} public async reloadAll(client: MangoClient): Promise { @@ -145,6 +150,7 @@ export class Group { promises.push(this.reloadPriceImpactData()); } promises.push( + this.updateLastUpdatedSlot(client), this.reloadAlts(client), this.reloadBanks(client, ids).then(() => Promise.all([ @@ -164,6 +170,11 @@ export class Group { // console.timeEnd('group.reload'); } + public async updateLastUpdatedSlot(client: MangoClient): Promise { + this.groupLastUpdatedSlot = + await client.program.provider.connection.getSlot(); + } + public async reloadPriceImpactData(): Promise { try { this.pis = await ( @@ -219,6 +230,7 @@ export class Group { this.banksMapByName = new Map(); this.banksMapByMint = new Map(); this.banksMapByTokenIndex = new Map(); + this.banksMapByOracle = new Map(); for (const bank of banks) { // ensure that freshly fetched banks have valid price until we fetch oracles again const oldBanks = oldbanksMapByTokenIndex.get(bank.tokenIndex); @@ -231,10 +243,18 @@ export class Group { this.banksMapByMint.get(mintId)?.push(bank); this.banksMapByName.get(bank.name)?.push(bank); this.banksMapByTokenIndex.get(bank.tokenIndex)?.push(bank); + this.banksMapByOracle.get(bank.oracle.toString())?.push(bank); + if (!bank.fallbackOracle.equals(PublicKey.default)) { + this.banksMapByOracle.get(bank.fallbackOracle.toString())?.push(bank); + } } else { this.banksMapByMint.set(mintId, [bank]); this.banksMapByName.set(bank.name, [bank]); this.banksMapByTokenIndex.set(bank.tokenIndex, [bank]); + this.banksMapByOracle.set(bank.oracle.toString(), [bank]); + if (!bank.fallbackOracle.equals(PublicKey.default)) { + this.banksMapByOracle.set(bank.fallbackOracle.toString(), [bank]); + } } } } @@ -570,6 +590,12 @@ export class Group { return banks[0]; } + public getFirstBankByOracle(oraclePk: PublicKey): Bank { + const banks = this.banksMapByOracle.get(oraclePk.toString()); + if (!banks) throw new Error(`No bank found for oracle ${oraclePk}!`); + return banks[0]; + } + /** * Returns a price impact in percentage, between 0 to 100 for a token, * returns -1 if data is bad diff --git a/ts/client/src/accounts/mangoAccount.ts b/ts/client/src/accounts/mangoAccount.ts index 948da0089..5f88887c7 100644 --- a/ts/client/src/accounts/mangoAccount.ts +++ b/ts/client/src/accounts/mangoAccount.ts @@ -1,7 +1,12 @@ import { AnchorProvider, BN } from '@coral-xyz/anchor'; import { utf8 } from '@coral-xyz/anchor/dist/cjs/utils/bytes'; import { OpenOrders, Order, Orderbook } from '@project-serum/serum/lib/market'; -import { AccountInfo, PublicKey } from '@solana/web3.js'; +import { + AccountInfo, + PublicKey, + TransactionInstruction, +} from '@solana/web3.js'; +import { PullFeed } from '@switchboard-xyz/on-demand'; import { MangoClient } from '../client'; import { OPENBOOK_PROGRAM_ID, RUST_I64_MAX, RUST_I64_MIN } from '../constants'; import { @@ -24,6 +29,7 @@ import { MangoSignatureStatus } from '../utils/rpc'; import { Bank, TokenIndex } from './bank'; import { Group } from './group'; import { HealthCache } from './healthCache'; +import { sbOnDemandProgram } from './oracle'; import { PerpMarket, PerpMarketIndex, PerpOrder, PerpOrderSide } from './perp'; import { MarketIndex, Serum3Side } from './serum3'; export class MangoAccount { @@ -1206,6 +1212,40 @@ export class MangoAccount { return toUiDecimalsForQuote(this.getMaxFeesBuyback(group)); } + public async buildIxsForStaleOrUnconfidentOracles( + client: MangoClient, + group: Group, + ): Promise { + return await this.buildIxsForStaleOrUnconfidentOraclesInternal( + group, + await client.buildHealthRemainingAccounts(group, [this]), + ); + } + + public async buildIxsForStaleOrUnconfidentOraclesInternal( + group: Group, + relevantOraclesToAUserAction: PublicKey[], + ): Promise { + const promises: Promise[] = []; + for (const oracle of relevantOraclesToAUserAction) { + const bank = group.getFirstBankByOracle(oracle); + if (!bank.isOracleStaleOrUnconfident(group.groupLastUpdatedSlot)) { + continue; + } + const pullFeed = new PullFeed( + sbOnDemandProgram as any, + new PublicKey(oracle), + ); + promises.push( + pullFeed.fetchUpdateIx({ + numSignatures: 2 /* TODO: This needs to be computed dynamically */, + }), + ); + } + + return (await Promise.all(promises)).map((item) => item[0]); + } + toString(group?: Group, onlyTokens = false): string { let res = 'MangoAccount'; res = res + '\n pk: ' + this.publicKey.toString(); diff --git a/ts/client/src/accounts/oracle.ts b/ts/client/src/accounts/oracle.ts index 42a7cb172..936f11cfd 100644 --- a/ts/client/src/accounts/oracle.ts +++ b/ts/client/src/accounts/oracle.ts @@ -43,7 +43,7 @@ export const SOL_MINT_MAINNET = new PublicKey( let sbv2DevnetProgram; let sbv2MainnetProgram; -let sbOnDemandProgram; +export let sbOnDemandProgram; let pythSolanaReceiverProgram; export enum OracleProvider { diff --git a/yarn.lock b/yarn.lock index ab3acbf2a..7cc28dc2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.24.8": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + "@blockworks-foundation/mango-v4-settings@0.14.24": version "0.14.24" resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.14.24.tgz#646b0802fb6222654e247bea7966106af9b7a970" @@ -33,6 +40,27 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@coral-xyz/anchor-30@npm:@coral-xyz/anchor@0.30.1", "switchboard-anchor@npm:@coral-xyz/anchor@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" + integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== + dependencies: + "@coral-xyz/anchor-errors" "^0.30.1" + "@coral-xyz/borsh" "^0.30.1" + "@noble/hashes" "^1.3.1" + "@solana/web3.js" "^1.68.0" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^6.3.0" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + "@coral-xyz/anchor-errors@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" @@ -101,27 +129,6 @@ superstruct "^0.15.4" toml "^3.0.0" -"@coral-xyz/anchor@^0.30.0": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" - integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== - dependencies: - "@coral-xyz/anchor-errors" "^0.30.1" - "@coral-xyz/borsh" "^0.30.1" - "@noble/hashes" "^1.3.1" - "@solana/web3.js" "^1.68.0" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^6.3.0" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - pako "^2.0.3" - snake-case "^3.0.4" - superstruct "^0.15.4" - toml "^3.0.0" - "@coral-xyz/borsh@^0.26.0": version "0.26.0" resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.26.0.tgz#d054f64536d824634969e74138f9f7c52bbbc0d5" @@ -138,7 +145,7 @@ bn.js "^5.1.2" buffer-layout "^1.2.0" -"@coral-xyz/borsh@^0.30.0", "@coral-xyz/borsh@^0.30.1": +"@coral-xyz/borsh@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" integrity sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ== @@ -677,7 +684,7 @@ dependencies: buffer "^6.0.3" -"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.54.0", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3", "@solana/web3.js@^1.91.1", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.93.0": +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.54.0", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.93.0": version "1.95.0" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.0.tgz#9cf08383e7dcba212a73d78349cf9b25bc34764f" integrity sha512-iHwJ/HcWrF9qbnI1ctwI1UXHJ0vZXRpnt+lI5UcQIk8WvJNuQ5gV06icxzM6B7ojUES85Q1/FM4jZ49UQ8yZZQ== @@ -698,6 +705,27 @@ rpc-websockets "^9.0.2" superstruct "^2.0.2" +"@solana/web3.js@^1.95.0": + version "1.95.2" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.2.tgz#6f8a0362fa75886a21550dbec49aad54481463a6" + integrity sha512-SjlHp0G4qhuhkQQc+YXdGkI8EerCqwxvgytMgBpzMUQTafrkNant3e7pgilBGgjy/iM40ICvWBLgASTPMrQU7w== + dependencies: + "@babel/runtime" "^7.24.8" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.1" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + "@solworks/soltoolkit-sdk@^0.0.23": version "0.0.23" resolved "https://registry.yarnpkg.com/@solworks/soltoolkit-sdk/-/soltoolkit-sdk-0.0.23.tgz#ef32d0aa79f888bcf0f639d280005b2e97cdc624" @@ -737,13 +765,13 @@ protobufjs "^7.2.6" yaml "^2.2.1" -"@switchboard-xyz/on-demand@^1.1.34": - version "1.1.34" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/on-demand/-/on-demand-1.1.34.tgz#bae40618d13ebdd156694cb3e3135a6b0c3a0dbd" - integrity sha512-mU20Kcgayv0l/USnQgL5wBGsZrobUDOAOW/vtjug5uTJGJsmHIUIRjyxa6dx1VseGHqUdkCWKz7vHK10T4kdbw== +"@switchboard-xyz/on-demand@^1.2.15": + version "1.2.15" + resolved "https://registry.yarnpkg.com/@switchboard-xyz/on-demand/-/on-demand-1.2.15.tgz#aae9e0e99700f713b0324ad3f4b1b4249007dcf4" + integrity sha512-CgeXeqdZh78FUnzs0oAyZcye7OQkaf5DNSqDDE7Sh62jKKtu+Bd1zcYu0MIRKVlCwg4Zk8R7lYRqel3jOKnCHg== dependencies: - "@coral-xyz/anchor" "^0.30.0" - "@solana/web3.js" "^1.91.1" + "@coral-xyz/anchor-30" "npm:@coral-xyz/anchor@0.30.1" + "@solana/web3.js" "^1.95.0" "@solworks/soltoolkit-sdk" "^0.0.23" "@switchboard-xyz/common" "^2.4.2" axios "^1.2.0" @@ -752,7 +780,6 @@ js-yaml "^4.1.0" node-cache "^5.1.2" protobufjs "^7.2.6" - shelljs "^0.8.5" "@switchboard-xyz/sbv2-lite@^0.1.6": version "0.1.6" @@ -1832,11 +1859,6 @@ fsevents@~2.3.2, fsevents@~2.3.3: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -1880,18 +1902,6 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" @@ -1943,13 +1953,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -2015,11 +2018,6 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2027,13 +2025,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.13.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2094,7 +2085,7 @@ isomorphic-ws@^5.0.0: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== -jayson@^4.1.0: +jayson@^4.1.0, jayson@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.1.tgz#282ff13d3cea09776db684b7eeca98c47b2fa99a" integrity sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w== @@ -2334,7 +2325,7 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2533,11 +2524,6 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -2610,13 +2596,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - reconnecting-websocket@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" @@ -2642,15 +2621,6 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.1.6: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -2717,15 +2687,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - shiki@^0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" @@ -2816,31 +2777,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -"switchboard-anchor@npm:@coral-xyz/anchor@0.30.0": - version "0.30.0" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.0.tgz#52acdba504b0008f1026d3a4bbbcb2d4feb5c69e" - integrity sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ== - dependencies: - "@coral-xyz/borsh" "^0.30.0" - "@noble/hashes" "^1.3.1" - "@solana/web3.js" "^1.68.0" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^6.3.0" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - pako "^2.0.3" - snake-case "^3.0.4" - superstruct "^0.15.4" - toml "^3.0.0" - text-encoding-utf-8@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13"