Skip to content

Commit

Permalink
more prep for sb on demand
Browse files Browse the repository at this point in the history
Signed-off-by: microwavedcola1 <[email protected]>
  • Loading branch information
microwavedcola1 committed Jul 30, 2024
1 parent ad129c4 commit 52f35ae
Show file tree
Hide file tree
Showing 7 changed files with 210 additions and 154 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -86,7 +86,7 @@
"fast-copy": "^3.0.1",
"lodash": "^4.17.21",
"node-kraken-api": "^2.2.2",
"switchboard-anchor": "npm:@coral-xyz/[email protected].0"
"switchboard-anchor": "npm:@coral-xyz/[email protected].1"
},
"resolutions": {
"**/@solana/web3.js/node-fetch": "npm:@blockworks-foundation/[email protected]",
Expand Down
93 changes: 73 additions & 20 deletions ts/client/scripts/maintain-alts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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<PublicKey[]> {
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,
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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}`);
}
}
Expand All @@ -124,7 +157,7 @@ async function createANewAlt() {
CLUSTER,
MANGO_V4_ID[CLUSTER],
{
idsSource: 'get-program-accounts',
idsSource: 'api',
},
);

Expand All @@ -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}`,
);
Expand All @@ -157,7 +192,7 @@ async function populateExistingAlts(): Promise<void> {
CLUSTER,
MANGO_V4_ID[CLUSTER],
{
idsSource: 'get-program-accounts',
idsSource: 'api',
},
);
const group = await client.getGroup(MANGO_V4_MAIN_GROUP);
Expand All @@ -169,13 +204,16 @@ async function populateExistingAlts(): Promise<void> {
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
Expand All @@ -185,7 +223,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'token banks',
[altAddress0],
[altAddress0, altAddress11],
Array.from(group.banksMapByMint.values())
.flat()
.map((bank) => bank.publicKey),
Expand All @@ -195,7 +233,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'token bank oracles',
[altAddress0],
[altAddress0, altAddress11],
Array.from(group.banksMapByMint.values())
.flat()
.map((bank) => bank.oracle),
Expand All @@ -205,7 +243,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'token bank vaults',
[altAddress0],
[altAddress0, altAddress11],
Array.from(group.banksMapByMint.values())
.flat()
.map((bank) => bank.vault),
Expand All @@ -216,7 +254,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'perp markets and perp oracles',
[altAddress0],
[altAddress0, altAddress11],
Array.from(group.perpMarketsMapByMarketIndex.values())
.flat()
.map((perpMarket) => [perpMarket.publicKey, perpMarket.oracle])
Expand All @@ -228,7 +266,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'well known addresses',
[altAddress0],
[altAddress0, altAddress11],
[
// Solana specific
SystemProgram.programId,
Expand All @@ -255,13 +293,16 @@ async function populateExistingAlts(): Promise<void> {
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])
Expand All @@ -273,7 +314,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'mint infos',
[altAddress1, altAddress2, altAddress3],
[altAddress1, altAddress2, altAddress3, altAddress4],
Array.from(group.mintInfosMapByMint.values())
.flat()
.map((mintInto) => [mintInto.publicKey])
Expand All @@ -286,7 +327,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'serum3 markets',
[altAddress1, altAddress2, altAddress3],
[altAddress1, altAddress2, altAddress3, altAddress4],
Array.from(group.serum3MarketsMapByMarketIndex.values())
.flat()
.map((serum3Market) => serum3Market.publicKey),
Expand All @@ -296,7 +337,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'serum3 external markets',
[altAddress1, altAddress2, altAddress3],
[altAddress1, altAddress2, altAddress3, altAddress4],
Array.from(group.serum3ExternalMarketsMap.values())
.flat()
.map((serum3ExternalMarket) => serum3ExternalMarket.publicKey),
Expand All @@ -306,7 +347,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'serum3 external markets bids',
[altAddress1, altAddress2, altAddress3],
[altAddress1, altAddress2, altAddress3, altAddress4],
Array.from(group.serum3ExternalMarketsMap.values())
.flat()
.map((serum3ExternalMarket) => serum3ExternalMarket.bidsAddress),
Expand All @@ -316,7 +357,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'serum3 external markets asks',
[altAddress1, altAddress2, altAddress3],
[altAddress1, altAddress2, altAddress3, altAddress4],
Array.from(group.serum3ExternalMarketsMap.values())
.flat()
.map((serum3ExternalMarket) => serum3ExternalMarket.asksAddress),
Expand All @@ -326,7 +367,7 @@ async function populateExistingAlts(): Promise<void> {
group,
payer,
'perp market event queues, bids, and asks',
[altAddress1, altAddress2, altAddress3],
[altAddress1, altAddress2, altAddress3, altAddress4],
Array.from(group.perpMarketsMapByMarketIndex.values())
.flat()
.map((perpMarket) => [
Expand All @@ -336,6 +377,18 @@ async function populateExistingAlts(): Promise<void> {
])
.flat(),
);

const altAddress21 = new PublicKey(
'BeJQmG5CC4XFc24StGjrE5tD7xbU1mYaofvXu2NiPxaT',
);
await extendTable(
client,
group,
payer,
'sb on demand oracles',
[altAddress21],
await buildSbOnDemandAccountsForAlts(connection),
);
} catch (error) {
console.log(error);
}
Expand Down
15 changes: 8 additions & 7 deletions ts/client/scripts/template.ts
Original file line number Diff line number Diff line change
@@ -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<void> {
Expand All @@ -20,23 +18,26 @@ async function main(): Promise<void> {
(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,
);

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);
}
Expand Down
Loading

0 comments on commit 52f35ae

Please sign in to comment.