Skip to content

Commit 772bf57

Browse files
committed
feat(taker): fallback to maker order when none available
1 parent ee79c1d commit 772bf57

File tree

2 files changed

+64
-7
lines changed

2 files changed

+64
-7
lines changed

lib/bloc/dex_repository.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:web_dex/mm2/mm2_api/mm2_api.dart';
44
import 'package:web_dex/mm2/mm2_api/rpc/base.dart';
55
import 'package:web_dex/mm2/mm2_api/rpc/best_orders/best_orders.dart';
66
import 'package:web_dex/mm2/mm2_api/rpc/best_orders/best_orders_request.dart';
7+
import 'package:web_dex/mm2/mm2_api/rpc/setprice/setprice_request.dart';
78
import 'package:web_dex/mm2/mm2_api/rpc/max_taker_vol/max_taker_vol_request.dart';
89
import 'package:web_dex/mm2/mm2_api/rpc/max_taker_vol/max_taker_vol_response.dart';
910
import 'package:web_dex/mm2/mm2_api/rpc/min_trading_vol/min_trading_vol.dart';
@@ -36,6 +37,20 @@ class DexRepository {
3637
}
3738
}
3839

40+
Future<Map<String, dynamic>?> setPrice(SetPriceRequest request) async {
41+
try {
42+
return await _mm2Api.setprice(request);
43+
} catch (e, s) {
44+
log(
45+
'Error setprice ${request.base}/${request.rel}: $e',
46+
path: 'dex_repository => setPrice',
47+
trace: s,
48+
isError: true,
49+
).ignore();
50+
return <String, dynamic>{'error': e.toString()};
51+
}
52+
}
53+
3954
Future<DataFromService<TradePreimage, BaseError>> getTradePreimage(
4055
String base,
4156
String rel,

lib/bloc/taker_form/taker_bloc.dart

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:web_dex/mm2/mm2_api/rpc/best_orders/best_orders.dart';
1717
import 'package:web_dex/mm2/mm2_api/rpc/best_orders/best_orders_request.dart';
1818
import 'package:web_dex/mm2/mm2_api/rpc/sell/sell_request.dart';
1919
import 'package:web_dex/mm2/mm2_api/rpc/sell/sell_response.dart';
20+
import 'package:web_dex/mm2/mm2_api/rpc/setprice/setprice_request.dart';
2021
import 'package:web_dex/model/available_balance_state.dart';
2122
import 'package:web_dex/model/coin.dart';
2223
import 'package:web_dex/model/data_from_service.dart';
@@ -92,13 +93,54 @@ class TakerBloc extends Bloc<TakerEvent, TakerState> {
9293
inProgress: () => true,
9394
));
9495

95-
final SellResponse response = await _dexRepo.sell(SellRequest(
96-
base: state.sellCoin!.abbr,
97-
rel: state.selectedOrder!.coin,
98-
volume: state.sellAmount!,
99-
price: state.selectedOrder!.price,
100-
orderType: SellBuyOrderType.fillOrKill,
101-
));
96+
final base = state.sellCoin!.abbr;
97+
final rel = state.selectedOrder!.coin;
98+
99+
BestOrders fetchedOrders = await _dexRepo.getBestOrders(
100+
BestOrdersRequest(
101+
coin: base,
102+
type: BestOrdersRequestType.number,
103+
number: 40,
104+
action: 'sell',
105+
),
106+
);
107+
108+
bool hasMatchingOrder = false;
109+
final ordersForRel = fetchedOrders.result?[rel];
110+
if (ordersForRel != null) {
111+
hasMatchingOrder =
112+
ordersForRel.any((order) => order.uuid == state.selectedOrder!.uuid);
113+
}
114+
115+
if (!hasMatchingOrder) {
116+
final response = await _dexRepo.setPrice(
117+
SetPriceRequest(
118+
base: base,
119+
rel: rel,
120+
volume: state.sellAmount!,
121+
price: state.selectedOrder!.price,
122+
),
123+
);
124+
final String? uuid = response?['result']?['uuid'] as String?;
125+
if (response == null || response['error'] != null || uuid == null) {
126+
add(TakerAddError(DexFormError(
127+
error: response?['error']?.toString() ?? 'Order failed')));
128+
emit(state.copyWith(inProgress: () => false));
129+
return;
130+
}
131+
emit(state.copyWith(swapUuid: () => uuid));
132+
return;
133+
}
134+
135+
final SellResponse response = await _dexRepo.sell(
136+
SellRequest(
137+
base: base,
138+
rel: rel,
139+
volume: state.sellAmount!,
140+
price: state.selectedOrder!.price,
141+
orderType: SellBuyOrderType.fillOrKill,
142+
),
143+
);
102144

103145
if (response.error != null) {
104146
add(TakerAddError(DexFormError(error: response.error!.message)));

0 commit comments

Comments
 (0)