From 91d59c1918b4eaeeeb1a0892aa2a824f3eee111f Mon Sep 17 00:00:00 2001 From: microwavedcola1 Date: Sun, 31 Jul 2022 09:57:56 +0200 Subject: [PATCH] close insurance vault also Signed-off-by: microwavedcola1 --- .../mango-v4/src/instructions/group_close.rs | 25 +++++++++++++++++-- .../tests/program_test/mango_client.rs | 8 +++++- ts/client/src/accounts/group.ts | 6 +++++ ts/client/src/client.ts | 1 + ts/client/src/mango_v4.ts | 14 +++++++++-- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/programs/mango-v4/src/instructions/group_close.rs b/programs/mango-v4/src/instructions/group_close.rs index 6a1dff53b..eeb3e5af3 100644 --- a/programs/mango-v4/src/instructions/group_close.rs +++ b/programs/mango-v4/src/instructions/group_close.rs @@ -1,6 +1,6 @@ use crate::state::*; use anchor_lang::prelude::*; -use anchor_spl::token::Token; +use anchor_spl::token::{self, CloseAccount, Token, TokenAccount}; #[derive(Accounts)] pub struct GroupClose<'info> { @@ -8,12 +8,16 @@ pub struct GroupClose<'info> { mut, constraint = group.load()?.testing == 1, has_one = admin, + has_one = insurance_vault, close = sol_destination )] pub group: AccountLoader<'info, Group>, pub admin: Signer<'info>, + #[account(mut)] + pub insurance_vault: Account<'info, TokenAccount>, + #[account(mut)] /// CHECK: target for account rent needs no checks pub sol_destination: UncheckedAccount<'info>, @@ -21,7 +25,24 @@ pub struct GroupClose<'info> { pub token_program: Program<'info, Token>, } -pub fn group_close(_ctx: Context) -> Result<()> { +pub fn group_close(ctx: Context) -> Result<()> { // TODO: checks + + // close insurance vault + let group = ctx.accounts.group.load()?; + let group_seeds = group_seeds!(group); + let cpi_accounts = CloseAccount { + account: ctx.accounts.insurance_vault.to_account_info(), + destination: ctx.accounts.sol_destination.to_account_info(), + authority: ctx.accounts.group.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + token::close_account(CpiContext::new_with_signer( + cpi_program, + cpi_accounts, + &[group_seeds], + ))?; + ctx.accounts.insurance_vault.exit(ctx.program_id)?; + Ok(()) } diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 7372b0413..c39a51bdc 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -1251,7 +1251,6 @@ impl<'keypair> ClientInstruction for GroupCreateInstruction<'keypair> { let accounts = Self::Accounts { group, creator: self.creator.pubkey(), - admin: self.creator.pubkey(), insurance_mint: self.insurance_mint, insurance_vault, payer: self.payer.pubkey(), @@ -1285,9 +1284,16 @@ impl<'keypair> ClientInstruction for GroupCloseInstruction<'keypair> { let program_id = mango_v4::id(); let instruction = Self::Instruction {}; + let insurance_vault = Pubkey::find_program_address( + &[self.group.as_ref(), b"InsuranceVault".as_ref()], + &program_id, + ) + .0; + let accounts = Self::Accounts { group: self.group, admin: self.admin.pubkey(), + insurance_vault, sol_destination: self.sol_destination, token_program: Token::id(), }; diff --git a/ts/client/src/accounts/group.ts b/ts/client/src/accounts/group.ts index c854b2681..1eeee14ec 100644 --- a/ts/client/src/accounts/group.ts +++ b/ts/client/src/accounts/group.ts @@ -16,6 +16,8 @@ export class Group { creator: PublicKey; admin: PublicKey; fastListingAdmin: PublicKey; + insuranceMint: PublicKey; + insuranceVault: PublicKey; groupNum: number; }, ): Group { @@ -24,6 +26,8 @@ export class Group { obj.creator, obj.admin, obj.fastListingAdmin, + obj.insuranceMint, + obj.insuranceVault, obj.groupNum, new Map(), new Map(), @@ -39,6 +43,8 @@ export class Group { public creator: PublicKey, public admin: PublicKey, public fastListingAdmin: PublicKey, + public insuranceMint: PublicKey, + public insuranceVault: PublicKey, public groupNum: number, public banksMap: Map, public serum3MarketsMap: Map, diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 3f6cb5d27..d6a24817f 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -95,6 +95,7 @@ export class MangoClient { .groupClose() .accounts({ group: group.publicKey, + insuranceVault: group.insuranceVault, admin: adminPk, solDestination: (this.program.provider as AnchorProvider).wallet .publicKey, diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index 935568334..d441e2a68 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -41,7 +41,7 @@ export type MangoV4 = { }, { "name": "insuranceVault", - "isMut": true, + "isMut": false, "isSigner": false, "pda": { "seeds": [ @@ -128,6 +128,11 @@ export type MangoV4 = { "isMut": false, "isSigner": true }, + { + "name": "insuranceVault", + "isMut": true, + "isSigner": false + }, { "name": "solDestination", "isMut": true, @@ -4945,7 +4950,7 @@ export const IDL: MangoV4 = { }, { "name": "insuranceVault", - "isMut": true, + "isMut": false, "isSigner": false, "pda": { "seeds": [ @@ -5032,6 +5037,11 @@ export const IDL: MangoV4 = { "isMut": false, "isSigner": true }, + { + "name": "insuranceVault", + "isMut": true, + "isSigner": false + }, { "name": "solDestination", "isMut": true,