close insurance vault also

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2022-07-31 09:57:56 +02:00
parent 0c3efe21a9
commit 91d59c1918
5 changed files with 49 additions and 5 deletions

View File

@ -1,6 +1,6 @@
use crate::state::*; use crate::state::*;
use anchor_lang::prelude::*; use anchor_lang::prelude::*;
use anchor_spl::token::Token; use anchor_spl::token::{self, CloseAccount, Token, TokenAccount};
#[derive(Accounts)] #[derive(Accounts)]
pub struct GroupClose<'info> { pub struct GroupClose<'info> {
@ -8,12 +8,16 @@ pub struct GroupClose<'info> {
mut, mut,
constraint = group.load()?.testing == 1, constraint = group.load()?.testing == 1,
has_one = admin, has_one = admin,
has_one = insurance_vault,
close = sol_destination close = sol_destination
)] )]
pub group: AccountLoader<'info, Group>, pub group: AccountLoader<'info, Group>,
pub admin: Signer<'info>, pub admin: Signer<'info>,
#[account(mut)]
pub insurance_vault: Account<'info, TokenAccount>,
#[account(mut)] #[account(mut)]
/// CHECK: target for account rent needs no checks /// CHECK: target for account rent needs no checks
pub sol_destination: UncheckedAccount<'info>, pub sol_destination: UncheckedAccount<'info>,
@ -21,7 +25,24 @@ pub struct GroupClose<'info> {
pub token_program: Program<'info, Token>, pub token_program: Program<'info, Token>,
} }
pub fn group_close(_ctx: Context<GroupClose>) -> Result<()> { pub fn group_close(ctx: Context<GroupClose>) -> Result<()> {
// TODO: checks // 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(()) Ok(())
} }

View File

@ -1251,7 +1251,6 @@ impl<'keypair> ClientInstruction for GroupCreateInstruction<'keypair> {
let accounts = Self::Accounts { let accounts = Self::Accounts {
group, group,
creator: self.creator.pubkey(), creator: self.creator.pubkey(),
admin: self.creator.pubkey(),
insurance_mint: self.insurance_mint, insurance_mint: self.insurance_mint,
insurance_vault, insurance_vault,
payer: self.payer.pubkey(), payer: self.payer.pubkey(),
@ -1285,9 +1284,16 @@ impl<'keypair> ClientInstruction for GroupCloseInstruction<'keypair> {
let program_id = mango_v4::id(); let program_id = mango_v4::id();
let instruction = Self::Instruction {}; 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 { let accounts = Self::Accounts {
group: self.group, group: self.group,
admin: self.admin.pubkey(), admin: self.admin.pubkey(),
insurance_vault,
sol_destination: self.sol_destination, sol_destination: self.sol_destination,
token_program: Token::id(), token_program: Token::id(),
}; };

View File

@ -16,6 +16,8 @@ export class Group {
creator: PublicKey; creator: PublicKey;
admin: PublicKey; admin: PublicKey;
fastListingAdmin: PublicKey; fastListingAdmin: PublicKey;
insuranceMint: PublicKey;
insuranceVault: PublicKey;
groupNum: number; groupNum: number;
}, },
): Group { ): Group {
@ -24,6 +26,8 @@ export class Group {
obj.creator, obj.creator,
obj.admin, obj.admin,
obj.fastListingAdmin, obj.fastListingAdmin,
obj.insuranceMint,
obj.insuranceVault,
obj.groupNum, obj.groupNum,
new Map(), new Map(),
new Map(), new Map(),
@ -39,6 +43,8 @@ export class Group {
public creator: PublicKey, public creator: PublicKey,
public admin: PublicKey, public admin: PublicKey,
public fastListingAdmin: PublicKey, public fastListingAdmin: PublicKey,
public insuranceMint: PublicKey,
public insuranceVault: PublicKey,
public groupNum: number, public groupNum: number,
public banksMap: Map<string, Bank>, public banksMap: Map<string, Bank>,
public serum3MarketsMap: Map<string, Serum3Market>, public serum3MarketsMap: Map<string, Serum3Market>,

View File

@ -95,6 +95,7 @@ export class MangoClient {
.groupClose() .groupClose()
.accounts({ .accounts({
group: group.publicKey, group: group.publicKey,
insuranceVault: group.insuranceVault,
admin: adminPk, admin: adminPk,
solDestination: (this.program.provider as AnchorProvider).wallet solDestination: (this.program.provider as AnchorProvider).wallet
.publicKey, .publicKey,

View File

@ -41,7 +41,7 @@ export type MangoV4 = {
}, },
{ {
"name": "insuranceVault", "name": "insuranceVault",
"isMut": true, "isMut": false,
"isSigner": false, "isSigner": false,
"pda": { "pda": {
"seeds": [ "seeds": [
@ -128,6 +128,11 @@ export type MangoV4 = {
"isMut": false, "isMut": false,
"isSigner": true "isSigner": true
}, },
{
"name": "insuranceVault",
"isMut": true,
"isSigner": false
},
{ {
"name": "solDestination", "name": "solDestination",
"isMut": true, "isMut": true,
@ -4945,7 +4950,7 @@ export const IDL: MangoV4 = {
}, },
{ {
"name": "insuranceVault", "name": "insuranceVault",
"isMut": true, "isMut": false,
"isSigner": false, "isSigner": false,
"pda": { "pda": {
"seeds": [ "seeds": [
@ -5032,6 +5037,11 @@ export const IDL: MangoV4 = {
"isMut": false, "isMut": false,
"isSigner": true "isSigner": true
}, },
{
"name": "insuranceVault",
"isMut": true,
"isSigner": false
},
{ {
"name": "solDestination", "name": "solDestination",
"isMut": true, "isMut": true,