Skip to content

Commit ffa97d0

Browse files
authored
Merge pull request #43 from oraichain/fix/orderbook-market-order-bug
Fix/orderbook market order bug
2 parents 2e5908d + 26b9567 commit ffa97d0

File tree

5 files changed

+833
-790
lines changed

5 files changed

+833
-790
lines changed

contracts/oraiswap_limit_order/src/contract.rs

Lines changed: 160 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -154,86 +154,86 @@ pub fn execute(
154154
// then submit order
155155
submit_order(deps, &orderbook_pair, info.sender, direction, paid_assets)
156156
}
157-
ExecuteMsg::SubmitMarketOrder {
158-
direction,
159-
asset_infos,
160-
base_amount,
161-
quote_amount,
162-
slippage,
163-
} => {
164-
let pair_key = pair_key(&[
165-
asset_infos[0].to_raw(deps.api)?,
166-
asset_infos[1].to_raw(deps.api)?,
167-
]);
168-
let orderbook_pair = read_orderbook(deps.storage, &pair_key)?;
169-
170-
let offer_asset_info = match direction {
171-
OrderDirection::Buy => orderbook_pair.quote_coin_info.to_normal(deps.api)?,
172-
OrderDirection::Sell => orderbook_pair.base_coin_info.to_normal(deps.api)?,
173-
};
174-
let provided_asset = get_native_asset(&info, offer_asset_info)?;
175-
176-
let expected_offer_amount = match direction {
177-
OrderDirection::Buy => quote_amount,
178-
OrderDirection::Sell => base_amount,
179-
};
180-
181-
if let Some(slippage) = slippage {
182-
if slippage >= Decimal::one() {
183-
return Err(ContractError::SlippageMustLessThanOne { slippage });
184-
}
185-
}
186-
187-
let base_amount_response = query_price_by_base_amount(
188-
deps.as_ref(),
189-
&orderbook_pair,
190-
direction,
191-
base_amount,
192-
slippage,
193-
)?;
194-
195-
// Return error if cannot find opposite side market order
196-
if base_amount_response.market_price.is_zero() {
197-
return Err(ContractError::UnableToFindMarketOrder {});
198-
}
199-
200-
let (paid_assets, quote_asset) = get_market_asset(
201-
deps.api,
202-
&orderbook_pair,
203-
direction,
204-
base_amount_response.market_price,
205-
base_amount_response.expected_base_amount,
206-
)?;
207-
208-
if provided_asset.amount < expected_offer_amount {
209-
return Err(ContractError::AssetMismatch {});
210-
}
211-
212-
// require minimum amount for quote asset
213-
if quote_asset.amount.lt(&orderbook_pair.min_quote_coin_amount) {
214-
return Err(ContractError::TooSmallQuoteAsset {
215-
quote_coin: quote_asset.info.to_string(),
216-
min_quote_amount: orderbook_pair.min_quote_coin_amount,
217-
});
218-
}
219-
220-
// calculate refund_amount
221-
let refund_amount = provided_asset
222-
.amount
223-
.checked_sub(paid_assets[0].amount)
224-
.unwrap_or_default();
225-
226-
// submit market order
227-
submit_market_order(
228-
deps,
229-
env.contract.address,
230-
&orderbook_pair,
231-
info.sender,
232-
direction,
233-
paid_assets,
234-
refund_amount,
235-
)
236-
}
157+
// ExecuteMsg::SubmitMarketOrder {
158+
// direction,
159+
// asset_infos,
160+
// base_amount,
161+
// quote_amount,
162+
// slippage,
163+
// } => {
164+
// let pair_key = pair_key(&[
165+
// asset_infos[0].to_raw(deps.api)?,
166+
// asset_infos[1].to_raw(deps.api)?,
167+
// ]);
168+
// let orderbook_pair = read_orderbook(deps.storage, &pair_key)?;
169+
170+
// let offer_asset_info = match direction {
171+
// OrderDirection::Buy => orderbook_pair.quote_coin_info.to_normal(deps.api)?,
172+
// OrderDirection::Sell => orderbook_pair.base_coin_info.to_normal(deps.api)?,
173+
// };
174+
// let provided_asset = get_native_asset(&info, offer_asset_info)?;
175+
176+
// let expected_offer_amount = match direction {
177+
// OrderDirection::Buy => quote_amount,
178+
// OrderDirection::Sell => base_amount,
179+
// };
180+
181+
// if let Some(slippage) = slippage {
182+
// if slippage >= Decimal::one() {
183+
// return Err(ContractError::SlippageMustLessThanOne { slippage });
184+
// }
185+
// }
186+
187+
// let base_amount_response = query_price_by_base_amount(
188+
// deps.as_ref(),
189+
// &orderbook_pair,
190+
// direction,
191+
// base_amount,
192+
// slippage,
193+
// )?;
194+
195+
// // Return error if cannot find opposite side market order
196+
// if base_amount_response.market_price.is_zero() {
197+
// return Err(ContractError::UnableToFindMarketOrder {});
198+
// }
199+
200+
// let (paid_assets, quote_asset) = get_market_asset(
201+
// deps.api,
202+
// &orderbook_pair,
203+
// direction,
204+
// base_amount_response.market_price,
205+
// base_amount_response.expected_base_amount,
206+
// )?;
207+
208+
// if provided_asset.amount < expected_offer_amount {
209+
// return Err(ContractError::AssetMismatch {});
210+
// }
211+
212+
// // require minimum amount for quote asset
213+
// if quote_asset.amount.lt(&orderbook_pair.min_quote_coin_amount) {
214+
// return Err(ContractError::TooSmallQuoteAsset {
215+
// quote_coin: quote_asset.info.to_string(),
216+
// min_quote_amount: orderbook_pair.min_quote_coin_amount,
217+
// });
218+
// }
219+
220+
// // calculate refund_amount
221+
// let refund_amount = provided_asset
222+
// .amount
223+
// .checked_sub(paid_assets[0].amount)
224+
// .unwrap_or_default();
225+
226+
// // submit market order
227+
// submit_market_order(
228+
// deps,
229+
// env.contract.address,
230+
// &orderbook_pair,
231+
// info.sender,
232+
// direction,
233+
// paid_assets,
234+
// refund_amount,
235+
// )
236+
// }
237237
ExecuteMsg::CancelOrder {
238238
order_id,
239239
asset_infos,
@@ -404,80 +404,80 @@ pub fn receive_cw20(
404404
// then submit order
405405
submit_order(deps, &orderbook_pair, sender, direction, paid_assets)
406406
}
407-
Ok(Cw20HookMsg::SubmitMarketOrder {
408-
direction,
409-
asset_infos,
410-
base_amount,
411-
quote_amount,
412-
slippage,
413-
}) => {
414-
let pair_key = pair_key(&[
415-
asset_infos[0].to_raw(deps.api)?,
416-
asset_infos[1].to_raw(deps.api)?,
417-
]);
418-
let orderbook_pair = read_orderbook(deps.storage, &pair_key)?;
419-
420-
let expected_offer_amount = match direction {
421-
OrderDirection::Buy => quote_amount,
422-
OrderDirection::Sell => base_amount,
423-
};
424-
425-
if let Some(slippage) = slippage {
426-
if slippage >= Decimal::one() {
427-
return Err(ContractError::SlippageMustLessThanOne { slippage });
428-
}
429-
}
430-
431-
let base_amount_response = query_price_by_base_amount(
432-
deps.as_ref(),
433-
&orderbook_pair,
434-
direction,
435-
base_amount,
436-
slippage,
437-
)?;
438-
439-
// Return error if cannot find opposite side market order
440-
if base_amount_response.market_price.is_zero() {
441-
return Err(ContractError::UnableToFindMarketOrder {});
442-
}
443-
444-
let (paid_assets, quote_asset) = get_market_asset(
445-
deps.api,
446-
&orderbook_pair,
447-
direction,
448-
base_amount_response.market_price,
449-
base_amount_response.expected_base_amount,
450-
)?;
451-
452-
if provided_asset.amount < expected_offer_amount {
453-
return Err(ContractError::AssetMismatch {});
454-
}
455-
456-
// require minimum amount for quote asset
457-
if quote_asset.amount.lt(&orderbook_pair.min_quote_coin_amount) {
458-
return Err(ContractError::TooSmallQuoteAsset {
459-
quote_coin: quote_asset.info.to_string(),
460-
min_quote_amount: orderbook_pair.min_quote_coin_amount,
461-
});
462-
}
463-
464-
// calculate refund_amount
465-
let refund_amount = provided_asset
466-
.amount
467-
.checked_sub(paid_assets[0].amount)
468-
.unwrap_or_default();
469-
470-
// submit market order
471-
submit_market_order(
472-
deps,
473-
env.contract.address,
474-
&orderbook_pair,
475-
sender,
476-
direction,
477-
paid_assets,
478-
refund_amount,
479-
)
480-
}
407+
// Ok(Cw20HookMsg::SubmitMarketOrder {
408+
// direction,
409+
// asset_infos,
410+
// base_amount,
411+
// quote_amount,
412+
// slippage,
413+
// }) => {
414+
// let pair_key = pair_key(&[
415+
// asset_infos[0].to_raw(deps.api)?,
416+
// asset_infos[1].to_raw(deps.api)?,
417+
// ]);
418+
// let orderbook_pair = read_orderbook(deps.storage, &pair_key)?;
419+
420+
// let expected_offer_amount = match direction {
421+
// OrderDirection::Buy => quote_amount,
422+
// OrderDirection::Sell => base_amount,
423+
// };
424+
425+
// if let Some(slippage) = slippage {
426+
// if slippage >= Decimal::one() {
427+
// return Err(ContractError::SlippageMustLessThanOne { slippage });
428+
// }
429+
// }
430+
431+
// let base_amount_response = query_price_by_base_amount(
432+
// deps.as_ref(),
433+
// &orderbook_pair,
434+
// direction,
435+
// base_amount,
436+
// slippage,
437+
// )?;
438+
439+
// // Return error if cannot find opposite side market order
440+
// if base_amount_response.market_price.is_zero() {
441+
// return Err(ContractError::UnableToFindMarketOrder {});
442+
// }
443+
444+
// let (paid_assets, quote_asset) = get_market_asset(
445+
// deps.api,
446+
// &orderbook_pair,
447+
// direction,
448+
// base_amount_response.market_price,
449+
// base_amount_response.expected_base_amount,
450+
// )?;
451+
452+
// if provided_asset.amount < expected_offer_amount {
453+
// return Err(ContractError::AssetMismatch {});
454+
// }
455+
456+
// // require minimum amount for quote asset
457+
// if quote_asset.amount.lt(&orderbook_pair.min_quote_coin_amount) {
458+
// return Err(ContractError::TooSmallQuoteAsset {
459+
// quote_coin: quote_asset.info.to_string(),
460+
// min_quote_amount: orderbook_pair.min_quote_coin_amount,
461+
// });
462+
// }
463+
464+
// // calculate refund_amount
465+
// let refund_amount = provided_asset
466+
// .amount
467+
// .checked_sub(paid_assets[0].amount)
468+
// .unwrap_or_default();
469+
470+
// // submit market order
471+
// submit_market_order(
472+
// deps,
473+
// env.contract.address,
474+
// &orderbook_pair,
475+
// sender,
476+
// direction,
477+
// paid_assets,
478+
// refund_amount,
479+
// )
480+
// }
481481
Err(_) => Err(ContractError::InvalidCw20HookMessage {}),
482482
}
483483
}
@@ -605,11 +605,15 @@ pub fn query_contract_info(deps: Deps) -> StdResult<ContractInfoResponse> {
605605
admin: deps.api.addr_humanize(&info.admin)?,
606606
commission_rate: info.commission_rate,
607607
reward_address: deps.api.addr_humanize(&info.reward_address)?,
608+
operator: if let Some(operator) = info.operator {
609+
Some(deps.api.addr_humanize(&operator)?)
610+
} else {
611+
None
612+
},
608613
})
609614
}
610615

611616
#[cfg_attr(not(feature = "library"), entry_point)]
612-
pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> StdResult<Response> {
613-
store_config(deps.storage, &msg.new_config)?;
617+
pub fn migrate(_deps: DepsMut, _env: Env, _msg: MigrateMsg) -> StdResult<Response> {
614618
Ok(Response::default())
615619
}

0 commit comments

Comments
 (0)