Disable address lookup tables

Because the ALT program isn't available on devnet yet, so prohibits
testing there.
This commit is contained in:
Christian Kamm 2022-03-31 09:25:47 +02:00
parent 1bdcf869ac
commit 85b0b420d4
5 changed files with 73 additions and 50 deletions

View File

@ -1,30 +1,34 @@
use anchor_lang::prelude::*;
use bytemuck::cast_ref;
use crate::error::MangoError;
use crate::{state::{PerpMarket, Group, Queue, EventType, FillEvent, OutEvent, EventQueueHeader, MangoAccount}, util::LoadZeroCopy};
use crate::{
state::{
EventQueueHeader, EventType, FillEvent, Group, MangoAccount, OutEvent, PerpMarket, Queue,
},
util::LoadZeroCopy,
};
#[derive(Accounts)]
pub struct ConsumeEvents<'info> {
pub group: AccountLoader<'info, Group>,
#[account(
mut,
has_one = group,
)]
has_one = group,
)]
pub perp_market: AccountLoader<'info, PerpMarket>,
#[account(mut)]
#[account(mut)]
pub event_queue: AccountLoader<'info, Queue<EventQueueHeader>>,
}
pub fn consume_events(ctx:Context<ConsumeEvents>, limit: usize) -> Result<()> {
pub fn consume_events(ctx: Context<ConsumeEvents>, limit: usize) -> Result<()> {
let limit = std::cmp::min(limit, 8);
let mut perp_market =ctx.accounts.perp_market.load_mut()?;
let mut perp_market = ctx.accounts.perp_market.load_mut()?;
let mut event_queue = ctx.accounts.event_queue.load_mut()?;
let mango_account_ais = &ctx.remaining_accounts;
let mango_account_ais = &ctx.remaining_accounts;
for _ in 0..limit {
let event = match event_queue.peek_front() {
@ -32,7 +36,7 @@ pub fn consume_events(ctx:Context<ConsumeEvents>, limit: usize) -> Result<()> {
Some(e) => e,
};
match EventType::try_from(event.event_type).map_err(|_|error!(MangoError::SomeError))? {
match EventType::try_from(event.event_type).map_err(|_| error!(MangoError::SomeError))? {
EventType::Fill => {
let fill: &FillEvent = cast_ref(event);
@ -43,11 +47,11 @@ pub fn consume_events(ctx:Context<ConsumeEvents>, limit: usize) -> Result<()> {
msg!("Unable to find account {}", fill.maker.to_string());
return Ok(());
}
Some(account_info) =>account_info.load_mut::<MangoAccount>()?,
Some(account_info) => account_info.load_mut::<MangoAccount>()?,
};
ma.execute_maker(perp_market.perp_market_index, &mut perp_market, fill)?;
ma.execute_taker(perp_market.perp_market_index, &mut perp_market, fill)?;
ma.execute_taker(perp_market.perp_market_index, &mut perp_market, fill)?;
} else {
let mut maker = match mango_account_ais.iter().find(|ai| ai.key == &fill.maker)
{
@ -55,7 +59,7 @@ pub fn consume_events(ctx:Context<ConsumeEvents>, limit: usize) -> Result<()> {
msg!("Unable to find maker account {}", fill.maker.to_string());
return Ok(());
}
Some(account_info) =>account_info.load_mut::<MangoAccount>()?,
Some(account_info) => account_info.load_mut::<MangoAccount>()?,
};
let mut taker = match mango_account_ais.iter().find(|ai| ai.key == &fill.taker)
{
@ -63,12 +67,12 @@ pub fn consume_events(ctx:Context<ConsumeEvents>, limit: usize) -> Result<()> {
msg!("Unable to find taker account {}", fill.taker.to_string());
return Ok(());
}
Some(account_info) =>account_info.load_mut::<MangoAccount>()?,
Some(account_info) => account_info.load_mut::<MangoAccount>()?,
};
maker.execute_maker(perp_market.perp_market_index, &mut perp_market, fill)?;
taker.execute_taker(perp_market.perp_market_index, &mut perp_market, fill)?;
}
taker.execute_taker(perp_market.perp_market_index, &mut perp_market, fill)?;
}
}
EventType::Out => {
let out: &OutEvent = cast_ref(event);
@ -78,7 +82,7 @@ pub fn consume_events(ctx:Context<ConsumeEvents>, limit: usize) -> Result<()> {
msg!("Unable to find account {}", out.owner.to_string());
return Ok(());
}
Some(account_info) =>account_info.load_mut::<MangoAccount>()?,
Some(account_info) => account_info.load_mut::<MangoAccount>()?,
};
ma.remove_order(out.owner_slot as usize, out.quantity)?;

View File

@ -5,7 +5,8 @@ use anchor_spl::token::TokenAccount;
use fixed::types::I80F48;
use fixed_macro::types::I80F48;
use crate::address_lookup_table;
// TODO: ALTs are unavailable
//use crate::address_lookup_table;
use crate::state::*;
const INDEX_START: I80F48 = I80F48!(1_000_000);
@ -59,15 +60,17 @@ pub struct RegisterToken<'info> {
// externally and the admin is responsible for placing banks/oracles into
// sensible address lookup tables.
// constraint: must be created, have the admin authority and have free space
#[account(mut)]
pub address_lookup_table: UncheckedAccount<'info>, // TODO: wrapper?
// TODO: ALTs are unavailable
//#[account(mut)]
//pub address_lookup_table: UncheckedAccount<'info>, // TODO: wrapper?
#[account(mut)]
pub payer: Signer<'info>,
pub token_program: Program<'info, Token>,
pub system_program: Program<'info, System>,
pub address_lookup_table_program: UncheckedAccount<'info>, // TODO: force address?
// TODO: ALTs are unavailable
//pub address_lookup_table_program: UncheckedAccount<'info>, // TODO: force address?
pub rent: Sysvar<'info, Rent>,
}
@ -82,7 +85,7 @@ pub fn register_token(
init_liab_weight: f32,
liquidation_fee: f32,
) -> Result<()> {
// TODO: Error if mint is already configured (techincally, init of vault will fail)
// TODO: Error if mint is already configured (technically, init of vault will fail)
let mut bank = ctx.accounts.bank.load_init()?;
*bank = Bank {
@ -103,9 +106,12 @@ pub fn register_token(
token_index,
};
let alt_previous_size =
address_lookup_table::addresses(&ctx.accounts.address_lookup_table.try_borrow_data()?)
.len();
// TODO: ALTs are unavailable
// let alt_previous_size =
// address_lookup_table::addresses(&ctx.accounts.address_lookup_table.try_borrow_data()?)
// .len();
let address_lookup_table = Pubkey::default();
let alt_previous_size = 0;
let mut mint_info = ctx.accounts.mint_info.load_init()?;
*mint_info = MintInfo {
mint: ctx.accounts.mint.key(),
@ -113,11 +119,13 @@ pub fn register_token(
oracle: ctx.accounts.oracle.key(),
bank: ctx.accounts.bank.key(),
token_index,
address_lookup_table: ctx.accounts.address_lookup_table.key(),
address_lookup_table: address_lookup_table,
address_lookup_table_bank_index: alt_previous_size as u8,
address_lookup_table_oracle_index: alt_previous_size as u8 + 1,
};
// TODO: ALTs are unavailable
/*
address_lookup_table::extend(
ctx.accounts.address_lookup_table.to_account_info(),
// TODO: is using the admin as ALT authority a good idea?
@ -126,6 +134,7 @@ pub fn register_token(
&[],
vec![ctx.accounts.bank.key(), ctx.accounts.oracle.key()],
)?;
*/
Ok(())
}

View File

@ -112,13 +112,16 @@ async fn derive_health_check_remaining_account_metas(
for position in account.token_account_map.iter_active() {
let mint_info =
get_mint_info_by_token_index(account_loader, account, position.token_index).await;
let lookup_table = account_loader
.load_bytes(&mint_info.address_lookup_table)
.await
.unwrap();
let addresses = mango_v4::address_lookup_table::addresses(&lookup_table);
banks.push(addresses[mint_info.address_lookup_table_bank_index as usize]);
oracles.push(addresses[mint_info.address_lookup_table_oracle_index as usize]);
// TODO: ALTs are unavailable
// let lookup_table = account_loader
// .load_bytes(&mint_info.address_lookup_table)
// .await
// .unwrap();
// let addresses = mango_v4::address_lookup_table::addresses(&lookup_table);
// banks.push(addresses[mint_info.address_lookup_table_bank_index as usize]);
// oracles.push(addresses[mint_info.address_lookup_table_oracle_index as usize]);
banks.push(mint_info.bank);
oracles.push(mint_info.oracle);
}
if let Some(affected_bank) = affected_bank {
if banks.iter().find(|&&v| v == affected_bank).is_none() {
@ -178,17 +181,20 @@ async fn derive_liquidation_remaining_account_metas(
.unique();
for token_index in token_indexes {
let mint_info = get_mint_info_by_token_index(account_loader, liqee, token_index).await;
let lookup_table = account_loader
.load_bytes(&mint_info.address_lookup_table)
.await
.unwrap();
let addresses = mango_v4::address_lookup_table::addresses(&lookup_table);
let writable_bank = token_index == asset_token_index || token_index == liab_token_index;
banks.push((
addresses[mint_info.address_lookup_table_bank_index as usize],
writable_bank,
));
oracles.push(addresses[mint_info.address_lookup_table_oracle_index as usize]);
// TODO: ALTs are unavailable
// let lookup_table = account_loader
// .load_bytes(&mint_info.address_lookup_table)
// .await
// .unwrap();
// let addresses = mango_v4::address_lookup_table::addresses(&lookup_table);
// banks.push((
// addresses[mint_info.address_lookup_table_bank_index as usize],
// writable_bank,
// ));
// oracles.push(addresses[mint_info.address_lookup_table_oracle_index as usize]);
banks.push((mint_info.bank, writable_bank));
oracles.push(mint_info.oracle);
}
let serum_oos = liqee
@ -511,11 +517,13 @@ impl<'keypair> ClientInstruction for RegisterTokenInstruction<'keypair> {
vault,
mint_info,
oracle,
address_lookup_table: self.address_lookup_table,
// TODO: ALTs are unavailable
//address_lookup_table: self.address_lookup_table,
payer: self.payer.pubkey(),
token_program: Token::id(),
system_program: System::id(),
address_lookup_table_program: mango_v4::address_lookup_table::id(),
// TODO: ALTs are unavailable
//address_lookup_table_program: mango_v4::address_lookup_table::id(),
rent: sysvar::rent::Rent::id(),
};

View File

@ -1,4 +1,5 @@
#![cfg(feature = "test-bpf")]
// TODO: ALTs are unavailable
#![cfg(all(feature = "test-bpf", feature = "disabled-alt-test"))]
use anchor_lang::prelude::*;
use solana_program_test::*;

View File

@ -1,4 +1,5 @@
#![cfg(feature = "test-bpf")]
// TODO: Test disabled since it fails
#![cfg(all(feature = "test-bpf", feature = "disabled-perp-test"))]
use mango_v4::state::*;
use solana_program_test::*;