mango-v4/programs/mango-v4/tests/test_group_address_lookup_t...

174 lines
4.6 KiB
Rust

// TODO: ALTs are unavailable
#![cfg(all(feature = "test-bpf", feature = "disabled-alt-test"))]
use anchor_lang::prelude::*;
use solana_program_test::*;
use solana_sdk::signature::Keypair;
use mango_v4::address_lookup_table;
use mango_v4::state::*;
use program_test::*;
mod program_test;
// This is an unspecific happy-case test that just runs a few instructions to check
// that they work in principle. It should be split up / renamed.
#[tokio::test]
async fn test_group_address_lookup_tables() -> Result<()> {
let context = TestContext::new().await;
let solana = &context.solana.clone();
let admin = &Keypair::new();
let owner = &context.users[0].key;
let payer = &context.users[1].key;
let mint0 = &context.mints[0];
let mint1 = &context.mints[1];
let mint2 = &context.mints[2];
let payer_mint_accounts = &context.users[1].token_accounts[0..=2];
//
// SETUP: Create a group
//
let group = send_tx(solana, GroupCreateInstruction { admin, payer })
.await
.unwrap()
.group;
let account = send_tx(
solana,
AccountCreateInstruction {
account_num: 0,
account_size: AccountSize::Large,
group,
owner,
payer,
},
)
.await
.unwrap()
.account;
//
// SETUP: Register three mints (and make oracles for them)
//
let register_mint = |index: TokenIndex, mint: MintCookie, address_lookup_table: Pubkey| async move {
let create_stub_oracle_accounts = send_tx(
solana,
StubOracleCreate {
mint: mint.pubkey,
payer,
},
)
.await
.unwrap();
let oracle = create_stub_oracle_accounts.oracle;
send_tx(
solana,
StubOracleSetInstruction {
group,
admin,
mint: mint.pubkey,
payer,
price: "1.0",
},
)
.await
.unwrap();
let register_token_accounts = send_tx(
solana,
RegisterTokenInstruction {
token_index: index,
decimals: mint.decimals,
maint_asset_weight: 0.9,
init_asset_weight: 0.8,
maint_liab_weight: 1.1,
init_liab_weight: 1.2,
liquidation_fee: 0.0,
group,
admin,
mint: mint.pubkey,
address_lookup_table,
payer,
},
)
.await
.unwrap();
let bank = register_token_accounts.bank;
(oracle, bank)
};
// mint0 and mint1
let address_lookup_table1 = solana.create_address_lookup_table(admin, payer).await;
// mint2
solana.advance_by_slots(1).await; // to get a different address
let address_lookup_table2 = solana.create_address_lookup_table(admin, payer).await;
let (oracle0, bank0) = register_mint(0, mint0.clone(), address_lookup_table1).await;
let (oracle1, bank1) = register_mint(1, mint1.clone(), address_lookup_table1).await;
let (oracle2, bank2) = register_mint(2, mint2.clone(), address_lookup_table2).await;
// check the resulting address maps
let data = solana
.get_account_data(address_lookup_table1)
.await
.unwrap();
assert_eq!(
address_lookup_table::addresses(&data),
[bank0, oracle0, bank1, oracle1]
);
let data = solana
.get_account_data(address_lookup_table2)
.await
.unwrap();
assert_eq!(address_lookup_table::addresses(&data), [bank2, oracle2]);
//
// TEST: Deposit funds for each token
//
{
let deposit_amount = 100;
for &payer_token in payer_mint_accounts {
send_tx(
solana,
TokenDepositInstruction {
amount: deposit_amount,
account,
token_account: payer_token,
token_authority: payer,
},
)
.await
.unwrap();
}
}
//
// TEST: Withdraw funds for each token
//
{
let withdraw_amount = 50;
for &payer_token in payer_mint_accounts {
send_tx(
solana,
TokenWithdrawInstruction {
amount: withdraw_amount,
allow_borrow: true,
account,
owner,
token_account: payer_token,
},
)
.await
.unwrap();
}
}
Ok(())
}