ts: Fix tokenDeregister() when ATA is missing

This commit is contained in:
Christian Kamm 2022-12-09 12:49:11 +01:00
parent 37060d4192
commit a91ff847f2
2 changed files with 29 additions and 25 deletions

View File

@ -4,11 +4,7 @@ import {
initializeAccount, initializeAccount,
WRAPPED_SOL_MINT, WRAPPED_SOL_MINT,
} from '@project-serum/serum/lib/token-instructions'; } from '@project-serum/serum/lib/token-instructions';
import { import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
ASSOCIATED_TOKEN_PROGRAM_ID,
createAssociatedTokenAccountInstruction,
TOKEN_PROGRAM_ID,
} from '@solana/spl-token';
import { import {
AccountMeta, AccountMeta,
Cluster, Cluster,
@ -19,7 +15,6 @@ import {
SystemProgram, SystemProgram,
SYSVAR_INSTRUCTIONS_PUBKEY, SYSVAR_INSTRUCTIONS_PUBKEY,
SYSVAR_RENT_PUBKEY, SYSVAR_RENT_PUBKEY,
Transaction,
TransactionInstruction, TransactionInstruction,
TransactionSignature, TransactionSignature,
} from '@solana/web3.js'; } from '@solana/web3.js';
@ -365,22 +360,18 @@ export class MangoClient {
const ai = await this.program.provider.connection.getAccountInfo( const ai = await this.program.provider.connection.getAccountInfo(
dustVaultPk, dustVaultPk,
); );
const preInstructions: TransactionInstruction[] = [];
if (!ai) { if (!ai) {
const tx = new Transaction(); preInstructions.push(
tx.add( await createAssociatedTokenAccountIdempotentInstruction(
createAssociatedTokenAccountInstruction( adminPk,
ASSOCIATED_TOKEN_PROGRAM_ID, adminPk,
TOKEN_PROGRAM_ID,
bank.mint, bank.mint,
dustVaultPk,
adminPk,
adminPk,
), ),
); );
await (this.program.provider as AnchorProvider).sendAndConfirm(tx);
} }
return await this.program.methods const ix = await this.program.methods
.tokenDeregister() .tokenDeregister()
.accounts({ .accounts({
group: group.publicKey, group: group.publicKey,
@ -397,7 +388,19 @@ export class MangoClient {
({ pubkey: pk, isWritable: true, isSigner: false } as AccountMeta), ({ pubkey: pk, isWritable: true, isSigner: false } as AccountMeta),
), ),
) )
.rpc(); .instruction();
return await sendTransaction(
this.program.provider as AnchorProvider,
[
...preInstructions,
ix,
],
group.addressLookupTablesList,
{
postSendTxCallback: this.postSendTxCallback,
},
);
} }
public async getBanksForGroup(group: Group): Promise<Bank[]> { public async getBanksForGroup(group: Group): Promise<Bank[]> {

View File

@ -46,14 +46,6 @@ async function main() {
let sig; let sig;
// close all banks
for (const banks of group.banksMapByMint.values()) {
sig = await client.tokenDeregister(group, banks[0].mint);
console.log(
`Removed token ${banks[0].name}, sig https://explorer.solana.com/tx/${sig}`,
);
}
// deregister all serum markets // deregister all serum markets
for (const market of group.serum3MarketsMapByExternal.values()) { for (const market of group.serum3MarketsMapByExternal.values()) {
sig = await client.serum3deregisterMarket( sig = await client.serum3deregisterMarket(
@ -73,6 +65,15 @@ async function main() {
); );
} }
// close all banks
for (const banks of group.banksMapByMint.values()) {
console.log(banks[0].toString());
sig = await client.tokenDeregister(group, banks[0].mint);
console.log(
`Removed token ${banks[0].name}, sig https://explorer.solana.com/tx/${sig}`,
);
}
// close stub oracles // close stub oracles
const stubOracles = await client.getStubOracle(group); const stubOracles = await client.getStubOracle(group);
for (const stubOracle of stubOracles) { for (const stubOracle of stubOracles) {