diff --git a/ts/client/scripts/governanceInstructions/constants.ts b/ts/client/scripts/governanceInstructions/constants.ts index 72b10f150..1f2dda934 100644 --- a/ts/client/scripts/governanceInstructions/constants.ts +++ b/ts/client/scripts/governanceInstructions/constants.ts @@ -50,6 +50,15 @@ export const SB_ORACLES = [ ['CHAI', 'GXRCfroqu9k4ZoS5MyjUSiuoRb1bhps7nacEQLkLBVgr'], ]; +export const SB_LST_ORACLES = [ + ['JSOL', '91yrNSV8mofYcP6NCsHNi2YgNxwukBenv5MCRFD92Rgp'], + ['HUBSOL', '318uRUE2RuYpvv1VwxC4eJwViDrRrxUTTqoUBV1cgUYi'], + ['DUALSOL', '6zBkSKhAqLT2SNRbzTbrom2siKhVZ6SLQcFPnvyexdTE'], + ['DIGITSOL', 'Am5rswhcxQhqviDXuaiZnLvkpmB4iJEdxmhqMMZDV3KJ'], + ['MANGOSOL', 'FLroEBBA4Fa8ENqfBmqyypq8U6ai2mD7c5k6Vfb2PWzv'], + ['COMPASSSOL', '9gFehBozPdWafFfPiZRbub2yUmwYJrGMvguKHii7cMTA'], +]; + export const PYTH_SPONSORED_ORACLES = [ ['SOL/USD', '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE'], ['JITOSOL/USD', 'AxaxyeDT8JnWERSaTKvFXvPKkEdxnamKSqpWbsSjYg1g'], diff --git a/ts/client/scripts/template.ts b/ts/client/scripts/template.ts index 47c99084d..77724939c 100644 --- a/ts/client/scripts/template.ts +++ b/ts/client/scripts/template.ts @@ -1,4 +1,6 @@ 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 { @@ -6,6 +8,36 @@ async function main(): Promise { const group = await client.getGroup( new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX'), ); + + const allOracles = Array.from(group.banksMapByName.values()) + .flat() + .map((b) => [b.name, b.oracle]) + .concat( + Array.from(group.banksMapByName.values()) + .flat() + .map((b) => [b.name, b.fallbackOracle]) + .filter( + (item) => + item[1] instanceof PublicKey && !item[1].equals(PublicKey.default), + ), + ); + + const oraclePublicKeys = allOracles.map((item) => item[1] as PublicKey); + const ais = await client.program.provider.connection.getMultipleAccountsInfo( + oraclePublicKeys, + ); + + const result = ais + .map((ai, idx) => { + return [ + isSwitchboardOracle(ai!) && !ai?.owner.equals(SB_ON_DEMAND_PID), + allOracles[idx], + ]; + }) + .filter((item) => item[0]) + .map((item) => item[1]); + + console.log(result); } main(); diff --git a/ts/client/scripts/update-risk-params.ts b/ts/client/scripts/update-risk-params.ts index 92a5cc6ba..9d0e15d44 100644 --- a/ts/client/scripts/update-risk-params.ts +++ b/ts/client/scripts/update-risk-params.ts @@ -23,7 +23,6 @@ import fs from 'fs'; import { Bank } from '../src/accounts/bank'; import { Group } from '../src/accounts/group'; import { MangoAccount } from '../src/accounts/mangoAccount'; -import { OracleProvider } from '../src/accounts/oracle'; import { MangoClient } from '../src/client'; import { NullTokenEditParams } from '../src/clientIxParamBuilder'; import { MANGO_V4_MAIN_GROUP as MANGO_V4_PRIMARY_GROUP } from '../src/constants'; @@ -38,7 +37,7 @@ import { MANGO_GOVERNANCE_PROGRAM, MANGO_MINT, MANGO_REALM_PK, - PYTH_SPONSORED_ORACLES, + SB_LST_ORACLES, } from './governanceInstructions/constants'; import { createProposal } from './governanceInstructions/createProposal'; import { @@ -207,15 +206,6 @@ async function updateTokenParams(): Promise { .map((banks) => banks[0]) .sort((a, b) => a.name.localeCompare(b.name)) .forEach(async (bank) => { - if (bank.oracleProvider != OracleProvider.Pyth) { - console.log(`Skipping ${bank.name}, since not pyth`); - return; - } - if (bank.reduceOnly == 1) { - console.log(`Skipping ${bank.name}, since reduceOnly`); - return; - } - const builder = Builder(NullTokenEditParams); let change = false; @@ -229,34 +219,51 @@ async function updateTokenParams(): Promise { bank?.initLiabWeight.toNumber().toFixed(1), ); - const maybePythV2Feed = PYTH_SPONSORED_ORACLES.filter( - (x) => - x[0].replace('/USD', '') == - (bank.name.includes('BTC') - ? 'BTC' - : bank.name.includes('ETH') - ? 'ETH' - : bank.name.toUpperCase()), + const maybeSbOracle = SB_LST_ORACLES.filter( + (x) => x[0] === bank.name.toLocaleUpperCase(), ); - - if (maybePythV2Feed.length > 0) { - console.log(` - ${bank.name} ${bank.oracle} ${maybePythV2Feed[0][0]}`); - builder.oracle(new PublicKey(maybePythV2Feed[0][1])); + if (maybeSbOracle.length > 0) { + console.log(` - ${bank.name} ${bank.oracle} ${maybeSbOracle[0][0]}`); + builder.oracle(new PublicKey(maybeSbOracle[0][1])); change = true; } else { - console.log(`Skipping ${bank.name}, cant find pyth feed`); + return; } - if ( - bank.reduceOnly != 1 && - maybePythV2Feed.length == 0 && - bank.oracleProvider == OracleProvider.Pyth && - !['CHAI', 'DAI', 'BLZE', 'MNGO', 'RENDER'].some( - (item) => item == bank.name, - ) - ) { - throw new Error(`No pyth feed for ${bank.name}`); - } + // if (bank.oracleProvider != OracleProvider.Pyth) { + // console.log(`Skipping ${bank.name}, since not pyth`); + // return; + // } + // if (bank.reduceOnly == 1) { + // console.log(`Skipping ${bank.name}, since reduceOnly`); + // return; + // } + // const maybePythV2Feed = PYTH_SPONSORED_ORACLES.filter( + // (x) => + // x[0].replace('/USD', '') == + // (bank.name.includes('BTC') + // ? 'BTC' + // : bank.name.includes('ETH') + // ? 'ETH' + // : bank.name.toUpperCase()), + // ); + // if (maybePythV2Feed.length > 0) { + // console.log(` - ${bank.name} ${bank.oracle} ${maybePythV2Feed[0][0]}`); + // builder.oracle(new PublicKey(maybePythV2Feed[0][1])); + // change = true; + // } else { + // console.log(`Skipping ${bank.name}, cant find pyth feed`); + // } + // if ( + // bank.reduceOnly != 1 && + // maybePythV2Feed.length == 0 && + // bank.oracleProvider == OracleProvider.Pyth && + // !['CHAI', 'DAI', 'BLZE', 'MNGO', 'RENDER'].some( + // (item) => item == bank.name, + // ) + // ) { + // throw new Error(`No pyth feed for ${bank.name}`); + // } // // eslint-disable-next-line no-constant-condition // if (true) { @@ -547,7 +554,9 @@ async function updateTokenParams(): Promise { walletSigner, MANGO_DAO_WALLET_GOVERNANCE, tokenOwnerRecord, - PROPOSAL_TITLE ? PROPOSAL_TITLE : 'Switch feeds from Pyth V1 to Pyth V2', + PROPOSAL_TITLE + ? PROPOSAL_TITLE + : 'Switch switchboard oracles for LSTs in mango-v4', PROPOSAL_LINK ?? '', Object.values(proposals).length, instructions,