Skip to content

Commit 8ec5672

Browse files
committed
Confine multiplier abstraction to AOB
1 parent 10e7021 commit 8ec5672

File tree

7 files changed

+93
-80
lines changed

7 files changed

+93
-80
lines changed

program/src/processor/cancel_order.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,10 @@ pub(crate) fn process(
151151
asks: accounts.asks,
152152
};
153153

154-
let order_summary = match agnostic_orderbook::instruction::cancel_order::process::<CallBackInfo>(
155-
program_id,
156-
invoke_accounts,
157-
invoke_params,
158-
) {
154+
let mut order_summary = match agnostic_orderbook::instruction::cancel_order::process::<
155+
CallBackInfo,
156+
>(program_id, invoke_accounts, invoke_params)
157+
{
159158
Err(error) => {
160159
error.print::<AoError>();
161160
return Err(DexError::AOBError.into());
@@ -164,6 +163,15 @@ pub(crate) fn process(
164163
};
165164
let side = get_side_from_order_id(order_id);
166165

166+
order_summary.total_base_qty = order_summary
167+
.total_base_qty
168+
.checked_mul(market_state.base_currency_multiplier)
169+
.unwrap();
170+
order_summary.total_quote_qty = order_summary
171+
.total_quote_qty
172+
.checked_mul(market_state.quote_currency_multiplier)
173+
.unwrap();
174+
167175
match side {
168176
Side::Bid => {
169177
user_account.header.quote_token_free = user_account

program/src/processor/consume_events.rs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -168,24 +168,30 @@ fn consume_event(
168168
let FillEvent {
169169
tag: _,
170170
taker_side,
171-
quote_size,
171+
mut quote_size,
172172
maker_order_id: _,
173-
base_size,
173+
mut base_size,
174174
..
175175
} = event;
176+
quote_size = quote_size
177+
.checked_mul(market_state.quote_currency_multiplier)
178+
.unwrap();
179+
base_size = base_size
180+
.checked_mul(market_state.base_currency_multiplier)
181+
.unwrap();
176182
let maker_account_info = &accounts[accounts
177183
.binary_search_by_key(&maker_callback_info.user_account, |k| *k.key)
178184
.map_err(|_| DexError::MissingUserAccount)?];
179185
let (taker_fee_tier, is_referred) = FeeTier::from_u8(taker_callback_info.fee_tier);
180186
let mut maker_account_data = maker_account_info.data.borrow_mut();
181187
let mut maker_account = UserAccount::from_buffer(&mut maker_account_data).unwrap();
182188
let (maker_fee_tier, _) = FeeTier::from_u8(maker_callback_info.fee_tier);
183-
let taker_fee = taker_fee_tier.taker_fee(*quote_size);
184-
let maker_rebate = maker_fee_tier.maker_rebate(*quote_size);
189+
let taker_fee = taker_fee_tier.taker_fee(quote_size);
190+
let maker_rebate = maker_fee_tier.maker_rebate(quote_size);
185191
let royalties_fee =
186-
market_state.royalties_bps.checked_mul(*quote_size).unwrap() / 10_000;
192+
market_state.royalties_bps.checked_mul(quote_size).unwrap() / 10_000;
187193
let referral_fee = if is_referred {
188-
taker_fee_tier.referral_fee(*quote_size)
194+
taker_fee_tier.referral_fee(quote_size)
189195
} else {
190196
0
191197
};
@@ -215,19 +221,19 @@ fn consume_event(
215221
maker_account.header.base_token_locked = maker_account
216222
.header
217223
.base_token_locked
218-
.checked_sub(*base_size)
224+
.checked_sub(base_size)
219225
.unwrap();
220226
}
221227
Side::Ask => {
222228
maker_account.header.base_token_free = maker_account
223229
.header
224230
.base_token_free
225-
.checked_add(*base_size)
231+
.checked_add(base_size)
226232
.unwrap();
227233
maker_account.header.quote_token_locked = maker_account
228234
.header
229235
.quote_token_locked
230-
.checked_sub(*quote_size)
236+
.checked_sub(quote_size)
231237
.unwrap();
232238
maker_account
233239
.header
@@ -242,16 +248,16 @@ fn consume_event(
242248
maker_account.header.accumulated_maker_quote_volume = maker_account
243249
.header
244250
.accumulated_maker_quote_volume
245-
.checked_add(*quote_size)
251+
.checked_add(quote_size)
246252
.unwrap();
247253
maker_account.header.accumulated_maker_base_volume = maker_account
248254
.header
249255
.accumulated_maker_base_volume
250-
.checked_add(*base_size)
256+
.checked_add(base_size)
251257
.unwrap();
252258

253-
market_state.quote_volume = market_state.quote_volume.checked_add(*quote_size).unwrap();
254-
market_state.base_volume = market_state.base_volume.checked_add(*base_size).unwrap();
259+
market_state.quote_volume = market_state.quote_volume.checked_add(quote_size).unwrap();
260+
market_state.base_volume = market_state.base_volume.checked_add(base_size).unwrap();
255261
}
256262
EventRef::Out(OutEventRef {
257263
event,
@@ -260,7 +266,7 @@ fn consume_event(
260266
let OutEvent {
261267
side,
262268
order_id,
263-
base_size,
269+
mut base_size,
264270
..
265271
} = event;
266272
let user_account_info = &accounts[accounts
@@ -269,23 +275,27 @@ fn consume_event(
269275
let mut user_account_data = user_account_info.data.borrow_mut();
270276
let mut user_account = UserAccount::from_buffer(&mut user_account_data).unwrap();
271277

272-
if *base_size != 0 {
278+
base_size = base_size
279+
.checked_mul(market_state.base_currency_multiplier)
280+
.unwrap();
281+
282+
if base_size != 0 {
273283
match Side::from_u8(*side).unwrap() {
274284
Side::Ask => {
275285
user_account.header.base_token_free = user_account
276286
.header
277287
.base_token_free
278-
.checked_add(*base_size)
288+
.checked_add(base_size)
279289
.unwrap();
280290
user_account.header.base_token_locked = user_account
281291
.header
282292
.base_token_locked
283-
.checked_sub(*base_size)
293+
.checked_sub(base_size)
284294
.unwrap();
285295
}
286296
Side::Bid => {
287297
let price = (order_id >> 64) as u64;
288-
let qty_to_transfer = fp32_mul(*base_size, price);
298+
let qty_to_transfer = fp32_mul(base_size, price);
289299
user_account.header.quote_token_free = user_account
290300
.header
291301
.quote_token_free

program/src/processor/create_market.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ pub(crate) fn process(
176176
base_volume: 0,
177177
quote_volume: 0,
178178
accumulated_fees: 0,
179-
min_base_order_size: *min_base_order_size / *base_currency_multiplier,
179+
min_base_order_size: *min_base_order_size,
180180
fee_type: MarketFeeType::Default as u8,
181181
_padding: [0; 6],
182182
royalties_bps: royalties_bps as u64,
@@ -186,7 +186,7 @@ pub(crate) fn process(
186186
};
187187

188188
let invoke_params = agnostic_orderbook::instruction::create_market::Params {
189-
min_base_order_size: *min_base_order_size,
189+
min_base_order_size: *min_base_order_size / *base_currency_multiplier,
190190
tick_size: *tick_size,
191191
};
192192
let invoke_accounts = agnostic_orderbook::instruction::create_market::Accounts {

program/src/processor/new_order.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ pub(crate) fn process(
218218
let Params {
219219
side,
220220
limit_price,
221-
mut max_base_qty,
221+
max_base_qty,
222222
mut max_quote_qty,
223223
order_type,
224224
self_trade_behavior,
@@ -235,11 +235,10 @@ pub(crate) fn process(
235235
let mut user_account_data = accounts.user.data.borrow_mut();
236236
let mut user_account = accounts.load_user_account(&mut user_account_data)?;
237237

238-
max_base_qty /= market_state.base_currency_multiplier;
239-
max_quote_qty /= market_state.quote_currency_multiplier;
238+
let max_base_qty_scaled = max_base_qty / market_state.base_currency_multiplier;
240239

241240
// Check the order size
242-
if max_base_qty < market_state.min_base_order_size {
241+
if max_base_qty < &market_state.min_base_order_size {
243242
msg!("The base order size is too small.");
244243
return Err(ProgramError::InvalidArgument);
245244
}
@@ -263,10 +262,11 @@ pub(crate) fn process(
263262
// We make sure to leave enough quote quantity to pay for taker fees in the worst case
264263
max_quote_qty = fee_tier.remove_taker_fee(max_quote_qty);
265264
}
265+
let max_quote_qty_scaled = max_quote_qty / market_state.quote_currency_multiplier;
266266

267267
let invoke_params = agnostic_orderbook::instruction::new_order::Params {
268-
max_base_qty,
269-
max_quote_qty,
268+
max_base_qty: max_base_qty_scaled,
269+
max_quote_qty: max_quote_qty_scaled,
270270
limit_price: *limit_price,
271271
side: FromPrimitive::from_u8(*side).unwrap(),
272272
match_limit: *match_limit,
@@ -294,6 +294,15 @@ pub(crate) fn process(
294294
Ok(s) => s,
295295
};
296296

297+
order_summary.total_base_qty = order_summary
298+
.total_base_qty
299+
.checked_mul(market_state.base_currency_multiplier)
300+
.unwrap();
301+
order_summary.total_quote_qty = order_summary
302+
.total_quote_qty
303+
.checked_mul(market_state.quote_currency_multiplier)
304+
.unwrap();
305+
297306
let (qty_to_transfer, transfer_destination, referral_fee) =
298307
match FromPrimitive::from_u8(*side).unwrap() {
299308
Side::Bid => {
@@ -319,12 +328,7 @@ pub(crate) fn process(
319328
user_account.header.base_token_free +=
320329
order_summary.total_base_qty - order_summary.total_base_qty_posted;
321330

322-
(
323-
q.checked_mul(market_state.quote_currency_multiplier)
324-
.unwrap(),
325-
accounts.quote_vault,
326-
referral_fee,
327-
)
331+
(q, accounts.quote_vault, referral_fee)
328332
}
329333
Side::Ask => {
330334
let q = order_summary
@@ -347,12 +351,7 @@ pub(crate) fn process(
347351
user_account.header.quote_token_free += taken_quote_qty
348352
.checked_sub(taker_fee + royalties_fees)
349353
.unwrap();
350-
(
351-
q.checked_mul(market_state.base_currency_multiplier)
352-
.unwrap(),
353-
accounts.base_vault,
354-
referral_fee,
355-
)
354+
(q, accounts.base_vault, referral_fee)
356355
}
357356
};
358357

@@ -362,7 +361,7 @@ pub(crate) fn process(
362361
if *side == Side::Bid as u8 {
363362
order_summary.total_quote_qty < max_quote_qty
364363
} else {
365-
order_summary.total_base_qty < max_base_qty
364+
&order_summary.total_base_qty < max_base_qty
366365
}
367366
}
368367
OrderType::PostOnly => order_summary.posted_order_id.is_none(),

program/src/processor/settle.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,7 @@ pub(crate) fn process(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramR
123123
accounts.destination_quote_account.key,
124124
accounts.market_signer.key,
125125
&[],
126-
user_account
127-
.header
128-
.quote_token_free
129-
.checked_mul(market_state.quote_currency_multiplier)
130-
.unwrap(),
126+
user_account.header.quote_token_free,
131127
)?;
132128

133129
invoke_signed(
@@ -150,11 +146,7 @@ pub(crate) fn process(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramR
150146
accounts.destination_base_account.key,
151147
accounts.market_signer.key,
152148
&[],
153-
user_account
154-
.header
155-
.base_token_free
156-
.checked_mul(market_state.base_currency_multiplier)
157-
.unwrap(),
149+
user_account.header.base_token_free,
158150
)?;
159151

160152
invoke_signed(

program/src/processor/swap.rs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ pub(crate) fn process(
167167
) -> ProgramResult {
168168
let Params {
169169
side,
170-
mut base_qty,
170+
base_qty,
171171
mut quote_qty,
172172
match_limit,
173173
has_discount_token_account,
@@ -177,11 +177,10 @@ pub(crate) fn process(
177177

178178
let market_state = DexState::get(accounts.market)?;
179179

180-
base_qty /= market_state.base_currency_multiplier;
181-
quote_qty /= market_state.quote_currency_multiplier;
180+
let base_qty_scaled = base_qty / market_state.base_currency_multiplier;
182181

183182
// Check the order size
184-
if base_qty < market_state.min_base_order_size {
183+
if base_qty < &market_state.min_base_order_size {
185184
msg!("The base order size is too small.");
186185
return Err(ProgramError::InvalidArgument);
187186
}
@@ -200,6 +199,7 @@ pub(crate) fn process(
200199
// We make sure to leave enough quote quantity to pay for taker fees in the worst case
201200
quote_qty = fee_tier.remove_taker_fee(quote_qty);
202201
}
202+
let quote_qty_scaled = quote_qty / market_state.quote_currency_multiplier;
203203

204204
let mut orderbook_guard = accounts.orderbook.data.borrow_mut();
205205
let orderbook = agnostic_orderbook::state::market_state::MarketState::from_buffer(
@@ -209,14 +209,19 @@ pub(crate) fn process(
209209
let tick_size = orderbook.tick_size;
210210
drop(orderbook_guard);
211211

212-
let (max_base_qty, max_quote_qty, limit_price) = match FromPrimitive::from_u8(*side).unwrap() {
213-
Side::Bid => (u64::MAX, quote_qty, u64::MAX - (u64::MAX % tick_size)),
214-
Side::Ask => (base_qty, u64::MAX, 0),
215-
};
212+
let (max_base_qty_scaled, max_quote_qty_scaled, limit_price) =
213+
match FromPrimitive::from_u8(*side).unwrap() {
214+
Side::Bid => (
215+
u64::MAX,
216+
quote_qty_scaled,
217+
u64::MAX - (u64::MAX % tick_size),
218+
),
219+
Side::Ask => (base_qty_scaled, u64::MAX, 0),
220+
};
216221

217222
let invoke_params = agnostic_orderbook::instruction::new_order::Params {
218-
max_base_qty,
219-
max_quote_qty,
223+
max_base_qty: max_base_qty_scaled,
224+
max_quote_qty: max_quote_qty_scaled,
220225
limit_price,
221226
side: FromPrimitive::from_u8(*side).unwrap(),
222227
match_limit: *match_limit,
@@ -245,6 +250,15 @@ pub(crate) fn process(
245250
Ok(s) => s,
246251
};
247252

253+
order_summary.total_base_qty = order_summary
254+
.total_base_qty
255+
.checked_mul(market_state.base_currency_multiplier)
256+
.unwrap();
257+
order_summary.total_quote_qty = order_summary
258+
.total_quote_qty
259+
.checked_mul(market_state.quote_currency_multiplier)
260+
.unwrap();
261+
248262
let referral_fee = fee_tier.referral_fee(order_summary.total_quote_qty);
249263
let royalties_fees = order_summary
250264
.total_quote_qty
@@ -259,18 +273,12 @@ pub(crate) fn process(
259273
order_summary.total_quote_qty +=
260274
fee_tier.taker_fee(order_summary.total_quote_qty) + royalties_fees;
261275

262-
let is_valid = order_summary.total_base_qty >= base_qty;
276+
let is_valid = &order_summary.total_base_qty >= base_qty;
263277

264278
(
265279
is_valid,
266-
order_summary
267-
.total_base_qty
268-
.checked_mul(market_state.base_currency_multiplier)
269-
.unwrap(),
270-
order_summary
271-
.total_quote_qty
272-
.checked_mul(market_state.quote_currency_multiplier)
273-
.unwrap(),
280+
order_summary.total_base_qty,
281+
order_summary.total_quote_qty,
274282
)
275283
}
276284
Side::Ask => {
@@ -280,14 +288,10 @@ pub(crate) fn process(
280288

281289
(
282290
is_valid,
283-
order_summary
284-
.total_base_qty
285-
.checked_mul(market_state.base_currency_multiplier)
286-
.unwrap(),
291+
order_summary.total_base_qty,
287292
order_summary
288293
.total_quote_qty
289294
.checked_sub(taker_fee + royalties_fees)
290-
.and_then(|n| n.checked_mul(market_state.quote_currency_multiplier))
291295
.unwrap(),
292296
)
293297
}

0 commit comments

Comments
 (0)