Remove use of array_map to allow dex to be verifiably built by anchor docker image's version of rust

This commit is contained in:
jhlx 2022-04-24 14:34:05 -04:00
parent 85b4f14990
commit 4d921bbbe9
3 changed files with 55 additions and 5 deletions

2
dex/Cargo.lock generated
View File

@ -982,7 +982,7 @@ dependencies = [
[[package]]
name = "serum_dex"
version = "0.5.5"
version = "0.5.6"
dependencies = [
"arbitrary",
"arrayref",

View File

@ -1943,7 +1943,10 @@ pub(crate) mod account_parser {
f: impl FnOnce(ReplaceOrdersByClientIdsArgs) -> DexResult<T>,
) -> DexResult<T> {
// Account indices for market, bids, asks, OpenOrders, owner, event_q
let cancel_accounts = [0, 4, 5, 1, 7, 3].map(|i| accounts[i].clone());
let cancel_accounts = [0, 4, 5, 1, 7, 3]
.iter()
.map(|i| accounts[*i].clone())
.collect::<Vec<_>>();
let mut client_order_ids = [0; 8];
for (instruction, client_order_id) in
instructions.iter().zip(client_order_ids.iter_mut())
@ -1955,7 +1958,7 @@ pub(crate) mod account_parser {
program_id,
instructions,
accounts,
cancel_accounts: &cancel_accounts[..],
cancel_accounts: cancel_accounts.as_slice(),
client_order_ids,
})
}
@ -3198,7 +3201,6 @@ impl State {
use solana_program::clock::Clock;
use crate::error::DexError;
drop(open_orders);
if deposit_amount != 0 {

View File

@ -665,8 +665,56 @@ fn test_replace_orders() {
assert_eq!(identity(open_orders.native_pc_total), 150_000);
}
// Replace order 0xabc1
// 0xabc1: 50K -> 60K (replaced)
// 0xabc2: 50K (unchanged)
// 0xabc3: 50K (unchanged)
{
let instruction_data = MarketInstruction::ReplaceOrderByClientId(NewOrderInstructionV3 {
side: Side::Bid,
limit_price: NonZeroU64::new(10_000).unwrap(),
max_coin_qty: NonZeroU64::new(10).unwrap(),
max_native_pc_qty_including_fees: NonZeroU64::new(60_000).unwrap(),
order_type: OrderType::Limit,
client_order_id: 0xabc1,
self_trade_behavior: SelfTradeBehavior::AbortTransaction,
limit: 5,
max_ts: i64::MAX,
})
.pack();
let instruction_accounts: &[AccountInfo] = bump_vec![in &bump;
accounts.market.clone(),
orders_account.clone(),
accounts.req_q.clone(),
accounts.event_q.clone(),
accounts.bids.clone(),
accounts.asks.clone(),
pc_account.clone(),
owner.clone(),
accounts.coin_vault.clone(),
accounts.pc_vault.clone(),
spl_token_program.clone(),
accounts.rent_sysvar.clone(),
]
.into_bump_slice();
State::process(dex_program_id, instruction_accounts, &instruction_data).unwrap();
}
{
let open_orders = Market::load(&accounts.market, &dex_program_id, false)
.unwrap()
.load_orders_mut(&orders_account, None, &dex_program_id, None, None)
.unwrap();
assert_eq!(identity(open_orders.native_coin_free), 0);
assert_eq!(identity(open_orders.native_coin_total), 0);
assert_eq!(identity(open_orders.native_pc_free), 0);
assert_eq!(identity(open_orders.native_pc_total), 160_000);
}
// Replace orders 0xabc1, 0xabc3, 0xabc4
// 0xabc1: 50K -> 70K (replaced)
// 0xabc1: 60K -> 70K (replaced)
// 0xabc2: 50K (unchanged)
// 0xabc3: 50K -> 70K (replaced)
// 0xabc4: 70K (new)