prepare group for ownership transfer to governance (#125)

* prepare group for ownership transfer to governance

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* Fixes from reviews

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* fix from review

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2022-07-31 09:28:16 +02:00 committed by GitHub
parent c88297f42e
commit 45fd36642e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 56 additions and 11 deletions

View File

@ -9,14 +9,14 @@ use crate::state::*;
pub struct GroupCreate<'info> {
#[account(
init,
seeds = [b"Group".as_ref(), admin.key().as_ref(), &group_num.to_le_bytes()],
seeds = [b"Group".as_ref(), creator.key().as_ref(), &group_num.to_le_bytes()],
bump,
payer = payer,
space = 8 + std::mem::size_of::<Group>(),
)]
pub group: AccountLoader<'info, Group>,
pub admin: Signer<'info>,
pub creator: Signer<'info>,
pub insurance_mint: Account<'info, Mint>,
@ -40,7 +40,9 @@ pub struct GroupCreate<'info> {
pub fn group_create(ctx: Context<GroupCreate>, group_num: u32, testing: u8) -> Result<()> {
let mut group = ctx.accounts.group.load_init()?;
group.admin = ctx.accounts.admin.key();
group.creator = ctx.accounts.creator.key();
group.admin = ctx.accounts.creator.key();
group.fast_listing_admin = Pubkey::default();
group.insurance_vault = ctx.accounts.insurance_vault.key();
group.insurance_mint = ctx.accounts.insurance_mint.key();
group.bump = *ctx.bumps.get("group").ok_or(MangoError::SomeError)?;

View File

@ -0,0 +1,26 @@
use anchor_lang::prelude::*;
use crate::state::*;
#[derive(Accounts)]
pub struct GroupEdit<'info> {
#[account(
mut,
has_one = admin,
)]
pub group: AccountLoader<'info, Group>,
pub admin: Signer<'info>,
}
// use case - transfer group ownership to governance, where
// new_admin and new_fast_listing_admin are PDAs
pub fn group_edit(
ctx: Context<GroupEdit>,
new_admin: Pubkey,
new_fast_listing_admin: Pubkey,
) -> Result<()> {
let mut group = ctx.accounts.group.load_mut()?;
group.admin = new_admin;
group.fast_listing_admin = new_fast_listing_admin;
Ok(())
}

View File

@ -9,6 +9,7 @@ pub use flash_loan2::*;
pub use flash_loan3::*;
pub use group_close::*;
pub use group_create::*;
pub use group_edit::*;
pub use liq_token_bankruptcy::*;
pub use liq_token_with_token::*;
pub use perp_cancel_all_orders::*;
@ -52,6 +53,7 @@ mod flash_loan2;
mod flash_loan3;
mod group_close;
mod group_create;
mod group_edit;
mod liq_token_bankruptcy;
mod liq_token_with_token;
mod perp_cancel_all_orders;

View File

@ -36,6 +36,14 @@ pub mod mango_v4 {
instructions::group_create(ctx, group_num, testing)
}
pub fn group_edit(
ctx: Context<GroupEdit>,
new_admin: Pubkey,
new_fast_listing_admin: Pubkey,
) -> Result<()> {
instructions::group_edit(ctx, new_admin, new_fast_listing_admin)
}
pub fn group_close(ctx: Context<GroupClose>) -> Result<()> {
instructions::group_close(ctx)
}

View File

@ -10,11 +10,16 @@ pub const QUOTE_TOKEN_INDEX: TokenIndex = 0;
#[derive(Debug)]
pub struct Group {
// ABI: Clients rely on this being at offset 8
pub admin: Pubkey,
pub creator: Pubkey,
// ABI: Clients rely on this being at offset 40
pub group_num: u32,
pub admin: Pubkey,
// TODO: unused, use case - listing shit tokens with conservative parameters (mostly defaults)
pub fast_listing_admin: Pubkey,
pub padding: [u8; 4],
pub insurance_vault: Pubkey,
@ -27,15 +32,16 @@ pub struct Group {
pub padding2: [u8; 6],
pub reserved: [u8; 8],
}
const_assert_eq!(size_of::<Group>(), 32 * 3 + 4 + 4 + 1 * 2 + 6 + 8);
const_assert_eq!(size_of::<Group>(), 32 * 5 + 4 + 4 + 1 * 2 + 6 + 8);
const_assert_eq!(size_of::<Group>() % 8, 0);
// note: using creator instead of admin, since admin can be changed
#[macro_export]
macro_rules! group_seeds {
( $group:expr ) => {
&[
b"Group".as_ref(),
$group.admin.as_ref(),
$group.creator.as_ref(),
&$group.group_num.to_le_bytes(),
&[$group.bump],
]

View File

@ -1214,7 +1214,7 @@ impl<'keypair> ClientInstruction for StubOracleCloseInstruction<'keypair> {
}
pub struct GroupCreateInstruction<'keypair> {
pub admin: &'keypair Keypair,
pub creator: &'keypair Keypair,
pub payer: &'keypair Keypair,
pub insurance_mint: Pubkey,
}
@ -1235,7 +1235,7 @@ impl<'keypair> ClientInstruction for GroupCreateInstruction<'keypair> {
let group = Pubkey::find_program_address(
&[
b"Group".as_ref(),
self.admin.pubkey().as_ref(),
self.creator.pubkey().as_ref(),
&instruction.group_num.to_le_bytes(),
],
&program_id,
@ -1250,7 +1250,8 @@ impl<'keypair> ClientInstruction for GroupCreateInstruction<'keypair> {
let accounts = Self::Accounts {
group,
admin: self.admin.pubkey(),
creator: self.creator.pubkey(),
admin: self.creator.pubkey(),
insurance_mint: self.insurance_mint,
insurance_vault,
payer: self.payer.pubkey(),
@ -1264,7 +1265,7 @@ impl<'keypair> ClientInstruction for GroupCreateInstruction<'keypair> {
}
fn signers(&self) -> Vec<&Keypair> {
vec![self.admin, self.payer]
vec![self.creator, self.payer]
}
}

View File

@ -39,7 +39,7 @@ impl<'a> GroupWithTokensConfig<'a> {
let create_group_accounts = send_tx(
solana,
GroupCreateInstruction {
admin,
creator: admin,
payer,
insurance_mint: mints[0].pubkey,
},