recharge_service.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import 'package:dio/dio.dart';
  2. import '../models/asset/recharge_order.dart';
  3. /// 链上充值订单 API(与 Web `stores/deposit.ts` 路径一致)
  4. class RechargeService {
  5. const RechargeService(this._dio);
  6. final Dio _dio;
  7. Future<List<RechargeParentCoin>> getRechargeParents() async {
  8. final response = await _dio.get<Map<String, dynamic>>(
  9. 'uc/coin-network/recharge-parents',
  10. );
  11. final data = response.data?['data'];
  12. if (data is List) {
  13. return data
  14. .whereType<Map<String, dynamic>>()
  15. .map(RechargeParentCoin.fromJson)
  16. .toList()
  17. ..sort((a, b) => a.sort.compareTo(b.sort));
  18. }
  19. return [];
  20. }
  21. Future<List<RechargeFlatNetworkOption>> getChildrenWithNetwork({
  22. required String coinName,
  23. }) async {
  24. final response = await _dio.get<Map<String, dynamic>>(
  25. 'uc/coin-network/children-with-network',
  26. queryParameters: {'coinName': coinName},
  27. );
  28. final data = response.data?['data'];
  29. if (data is! List) {
  30. return [];
  31. }
  32. final out = <_FlatNetSort>[];
  33. for (final raw in data.whereType<Map<String, dynamic>>()) {
  34. final coin = raw['coin'];
  35. if (coin is! Map<String, dynamic>) {
  36. continue;
  37. }
  38. final coinNameRaw = coin['name']?.toString() ?? '';
  39. final coinNameCnRaw = coin['nameCn']?.toString() ?? '';
  40. final nets = raw['networkConfigs'];
  41. if (nets is! List) {
  42. continue;
  43. }
  44. for (final n in nets.whereType<Map<String, dynamic>>()) {
  45. final network = n['network'];
  46. final protocol = network is Map<String, dynamic>
  47. ? network['protocol']?.toString() ?? ''
  48. : '';
  49. final netName = network is Map<String, dynamic>
  50. ? network['name']?.toString() ?? ''
  51. : '';
  52. final cfgId =
  53. int.tryParse(n['id']?.toString() ?? '') ?? 0;
  54. final sort = int.tryParse(n['sort']?.toString() ?? '') ?? 0;
  55. out.add(
  56. _FlatNetSort(
  57. sort: sort,
  58. option: RechargeFlatNetworkOption(
  59. coinName: coinNameRaw,
  60. coinNameCn: coinNameCnRaw,
  61. networkConfigId: cfgId,
  62. networkName: netName,
  63. protocol: protocol,
  64. contractAddress: n['contractAddress']?.toString() ?? '',
  65. rechargeAddress: n['rechargeAddress']?.toString() ?? '',
  66. ),
  67. ),
  68. );
  69. }
  70. }
  71. out.sort((a, b) => a.sort.compareTo(b.sort));
  72. return out.map((e) => e.option).toList();
  73. }
  74. Future<RechargeOrderDetail> createRechargeOrder({
  75. required String coinName,
  76. required int networkConfigId,
  77. required String amount,
  78. }) async {
  79. final response = await _dio.post<Map<String, dynamic>>(
  80. 'uc/recharge/create',
  81. data: {
  82. 'coinName': coinName,
  83. 'networkConfigId': networkConfigId.toString(),
  84. 'amount': amount.trim(),
  85. },
  86. options: Options(contentType: Headers.formUrlEncodedContentType),
  87. );
  88. final data = response.data?['data'];
  89. if (data is Map<String, dynamic>) {
  90. return RechargeOrderDetail.fromJson(data);
  91. }
  92. throw StateError('create recharge: invalid response');
  93. }
  94. Future<RechargeOrderDetail> submitTxHash({
  95. required String orderNo,
  96. required String txHash,
  97. }) async {
  98. final response = await _dio.post<Map<String, dynamic>>(
  99. 'uc/recharge/submit-hash',
  100. data: {
  101. 'orderNo': orderNo,
  102. 'txHash': txHash.trim(),
  103. },
  104. options: Options(contentType: Headers.formUrlEncodedContentType),
  105. );
  106. final data = response.data?['data'];
  107. if (data is Map<String, dynamic>) {
  108. return RechargeOrderDetail.fromJson(data);
  109. }
  110. throw StateError('submit-hash: invalid response');
  111. }
  112. }
  113. class _FlatNetSort {
  114. _FlatNetSort({required this.sort, required this.option});
  115. final int sort;
  116. final RechargeFlatNetworkOption option;
  117. }