diff --git a/ts/client/scripts/maintain-alts.ts b/ts/client/scripts/maintain-alts.ts index fc082a14d..58b53db51 100644 --- a/ts/client/scripts/maintain-alts.ts +++ b/ts/client/scripts/maintain-alts.ts @@ -1,4 +1,4 @@ -import { AnchorProvider } from '@coral-xyz/anchor'; +import { AnchorProvider, Wallet } from '@coral-xyz/anchor'; import { ASSOCIATED_TOKEN_PROGRAM_ID, NATIVE_MINT, @@ -6,7 +6,9 @@ import { } from '@solana/spl-token'; import { AddressLookupTableProgram, + Cluster, ComputeBudgetProgram, + Connection, Keypair, PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY, @@ -15,9 +17,15 @@ import { import fs from 'fs'; import { Group } from '../src/accounts/group'; import { MangoClient } from '../src/client'; -import { MANGO_V4_MAIN_GROUP, OPENBOOK_PROGRAM_ID } from '../src/constants'; +import { + MANGO_V4_ID, + MANGO_V4_MAIN_GROUP, + OPENBOOK_PROGRAM_ID, +} from '../src/constants'; import { buildVersionedTx } from '../src/utils'; -const { MB_CLUSTER_URL, MB_PAYER_KEYPAIR, DRY_RUN } = process.env; + +const { MB_CLUSTER_URL, MB_PAYER3_KEYPAIR, DRY_RUN } = process.env; +const CLUSTER: Cluster = (process.env.CLUSTER as Cluster) || 'mainnet-beta'; // eslint-disable-next-line no-inner-declarations async function extendTable( @@ -50,14 +58,16 @@ async function extendTable( addresses, }); + console.log( + `Extending ${altAddress} with ${nick} ${ + addresses.length + } addresses - ${addresses.join(', ')}`, + ); + if (DRY_RUN) { - console.log( - `Extending ${altAddress} with ${nick} ${ - addresses.length - } addresses - ${addresses.join(', ')}`, - ); return; } + const extendTx = await buildVersionedTx( client.program.provider as AnchorProvider, [extendIx], @@ -69,155 +79,176 @@ async function extendTable( } async function run(): Promise { - const client = await MangoClient.connectDefault(MB_CLUSTER_URL!); - const group = await client.getGroup(MANGO_V4_MAIN_GROUP); + try { + const options = AnchorProvider.defaultOptions(); + const connection = new Connection(MB_CLUSTER_URL!, options); + const payer = Keypair.fromSecretKey( + Buffer.from(JSON.parse(fs.readFileSync(MB_PAYER3_KEYPAIR!, 'utf-8'))), + ); + const payerWallet = new Wallet(payer); + const userProvider = new AnchorProvider(connection, payerWallet, options); + const client = await MangoClient.connect( + userProvider, + CLUSTER, + MANGO_V4_ID[CLUSTER], + { + idsSource: 'get-program-accounts', + }, + ); + const group = await client.getGroup(MANGO_V4_MAIN_GROUP); - const payer = Keypair.fromSecretKey( - Buffer.from(JSON.parse(fs.readFileSync(MB_PAYER_KEYPAIR!, 'utf-8'))), - ); + // + // Table 0 - liquidation relevant accounts + // + // const altAddress0 = group.addressLookupTablesList[0].key; + const altAddress0 = new PublicKey( + 'AgCBUZ6UMWqPLftTxeAqpQxtrfiCyL2HgRfmmM6QTfCj', + ); + // group and insurance vault + await extendTable(client, group, payer, 'group', altAddress0, [ + group.publicKey, + group.insuranceVault, + ]); + // Banks + vaults + oracles + // Split into 3 ixs since we end up with RangeError: encoding overruns Uint8Array otherwise + await extendTable( + client, + group, + payer, + 'token banks', + altAddress0, + Array.from(group.banksMapByMint.values()) + .flat() + .map((bank) => bank.publicKey), + ); + await extendTable( + client, + group, + payer, + 'token bank oracles', + altAddress0, + Array.from(group.banksMapByMint.values()) + .flat() + .map((bank) => bank.oracle), + ); + await extendTable( + client, + group, + payer, + 'token bank vaults', + altAddress0, + Array.from(group.banksMapByMint.values()) + .flat() + .map((bank) => bank.vault), + ); + // Perps + oracles + await extendTable( + client, + group, + payer, + 'perp markets and perp oracles', + altAddress0, + Array.from(group.perpMarketsMapByMarketIndex.values()) + .flat() + .map((perpMarket) => [perpMarket.publicKey, perpMarket.oracle]) + .flat(), + ); + // Well known addressess + await extendTable( + client, + group, + payer, + 'well known addresses', + altAddress0, + [ + // Solana specific + SystemProgram.programId, + TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID, + NATIVE_MINT, + SYSVAR_INSTRUCTIONS_PUBKEY, + ComputeBudgetProgram.programId, + // Misc. + OPENBOOK_PROGRAM_ID['mainnet-beta'], + ], + ); - // - // Table 0 - liquidation relevant accounts - // - // const altAddress0 = group.addressLookupTablesList[0].key; - const altAddress0 = new PublicKey( - 'AgCBUZ6UMWqPLftTxeAqpQxtrfiCyL2HgRfmmM6QTfCj', - ); - // group and insurance vault - await extendTable(client, group, payer, 'group', altAddress0, [ - group.publicKey, - group.insuranceVault, - ]); - // Banks + vaults + oracles - // Split into 3 ixs since we end up with RangeError: encoding overruns Uint8Array otherwise - await extendTable( - client, - group, - payer, - 'token banks', - altAddress0, - Array.from(group.banksMapByMint.values()) - .flat() - .map((bank) => bank.publicKey), - ); - await extendTable( - client, - group, - payer, - 'token bank oracles', - altAddress0, - Array.from(group.banksMapByMint.values()) - .flat() - .map((bank) => bank.oracle), - ); - await extendTable( - client, - group, - payer, - 'token bank vaults', - altAddress0, - Array.from(group.banksMapByMint.values()) - .flat() - .map((bank) => bank.vault), - ); - // Perps + oracles - await extendTable( - client, - group, - payer, - 'perp markets and perp oracles', - altAddress0, - Array.from(group.perpMarketsMapByMarketIndex.values()) - .flat() - .map((perpMarket) => [perpMarket.publicKey, perpMarket.oracle]) - .flat(), - ); - // Well known addressess - await extendTable(client, group, payer, 'well known addresses', altAddress0, [ - // Solana specific - SystemProgram.programId, - TOKEN_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID, - NATIVE_MINT, - SYSVAR_INSTRUCTIONS_PUBKEY, - ComputeBudgetProgram.programId, - // Misc. - OPENBOOK_PROGRAM_ID['mainnet-beta'], - ]); - - // - // Table 1 - everything else - // - // const altAddress1 = group.addressLookupTablesList[1].key; - const altAddress1 = new PublicKey( - 'FGZCgVhVGqzfWnmJFP9Hx4BvGvnFApEp1dM2whzXvg1Z', - ); - // bank mints - await extendTable( - client, - group, - payer, - 'token mints', - altAddress1, - Array.from(group.banksMapByMint.values()) - .flat() - .map((bank) => [bank.mint]) - .flat(), - ); - // bank mint infos - await extendTable( - client, - group, - payer, - 'mint infos', - altAddress1, - Array.from(group.mintInfosMapByMint.values()) - .flat() - .map((mintInto) => [mintInto.publicKey]) - .flat(), - ); - // serum3 - // Split into 4 ixs since we end up with RangeError: encoding overruns Uint8Array otherwise - await extendTable( - client, - group, - payer, - 'serum3 markets', - altAddress1, - Array.from(group.serum3MarketsMapByMarketIndex.values()) - .flat() - .map((serum3Market) => serum3Market.publicKey), - ); - await extendTable( - client, - group, - payer, - 'serum3 external markets', - altAddress1, - Array.from(group.serum3ExternalMarketsMap.values()) - .flat() - .map((serum3ExternalMarket) => serum3ExternalMarket.publicKey), - ); - await extendTable( - client, - group, - payer, - 'serum3 external markets bids', - altAddress1, - Array.from(group.serum3ExternalMarketsMap.values()) - .flat() - .map((serum3ExternalMarket) => serum3ExternalMarket.bidsAddress), - ); - await extendTable( - client, - group, - payer, - 'serum3 external markets asks', - altAddress1, - Array.from(group.serum3ExternalMarketsMap.values()) - .flat() - .map((serum3ExternalMarket) => serum3ExternalMarket.asksAddress), - ); + // + // Table 1 - everything else + // + // const altAddress1 = group.addressLookupTablesList[1].key; + const altAddress1 = new PublicKey( + 'FGZCgVhVGqzfWnmJFP9Hx4BvGvnFApEp1dM2whzXvg1Z', + ); + // bank mints + await extendTable( + client, + group, + payer, + 'token mints', + altAddress1, + Array.from(group.banksMapByMint.values()) + .flat() + .map((bank) => [bank.mint]) + .flat(), + ); + // bank mint infos + await extendTable( + client, + group, + payer, + 'mint infos', + altAddress1, + Array.from(group.mintInfosMapByMint.values()) + .flat() + .map((mintInto) => [mintInto.publicKey]) + .flat(), + ); + // serum3 + // Split into 4 ixs since we end up with RangeError: encoding overruns Uint8Array otherwise + await extendTable( + client, + group, + payer, + 'serum3 markets', + altAddress1, + Array.from(group.serum3MarketsMapByMarketIndex.values()) + .flat() + .map((serum3Market) => serum3Market.publicKey), + ); + await extendTable( + client, + group, + payer, + 'serum3 external markets', + altAddress1, + Array.from(group.serum3ExternalMarketsMap.values()) + .flat() + .map((serum3ExternalMarket) => serum3ExternalMarket.publicKey), + ); + await extendTable( + client, + group, + payer, + 'serum3 external markets bids', + altAddress1, + Array.from(group.serum3ExternalMarketsMap.values()) + .flat() + .map((serum3ExternalMarket) => serum3ExternalMarket.bidsAddress), + ); + await extendTable( + client, + group, + payer, + 'serum3 external markets asks', + altAddress1, + Array.from(group.serum3ExternalMarketsMap.values()) + .flat() + .map((serum3ExternalMarket) => serum3ExternalMarket.asksAddress), + ); + } catch (error) { + console.log(error); + } } run();