spot_transfer_asset.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import '../../data/models/asset/today_pnl.dart';
  2. /// 解析现货各币种可用余额(对齐 Web `parseSpotAvailableMap`)。
  3. Map<String, String> parseSpotAvailableMap(Map<String, dynamic> spotData) {
  4. final map = <String, String>{};
  5. final list = spotData['assetList'];
  6. if (list is! List) {
  7. return map;
  8. }
  9. for (final item in list) {
  10. if (item is! Map<String, dynamic>) {
  11. continue;
  12. }
  13. final coin = '${item['symbol'] ?? item['coinId'] ?? item['coin'] ?? ''}'
  14. .toUpperCase()
  15. .trim();
  16. if (coin.isEmpty) {
  17. continue;
  18. }
  19. final avail = item['available'] ?? item['balance'];
  20. map[coin] = '${avail ?? '0'}';
  21. }
  22. return map;
  23. }
  24. /// 现货币种开放列表(对齐 Web `parseOpenCoinSymbols`)。
  25. List<String> parseOpenCoinSymbols(List<Map<String, dynamic>> coinsRaw) {
  26. final set = <String>{};
  27. for (final item in coinsRaw) {
  28. final sym =
  29. '${item['symbol'] ?? item['coinSymbol'] ?? ''}'.toUpperCase().trim();
  30. if (sym.isNotEmpty) {
  31. set.add(sym);
  32. }
  33. }
  34. final list = set.toList()
  35. ..sort((a, b) {
  36. if (a == 'USDT') {
  37. return -1;
  38. }
  39. if (b == 'USDT') {
  40. return 1;
  41. }
  42. return a.compareTo(b);
  43. });
  44. if (list.isEmpty) {
  45. return const ['USDT'];
  46. }
  47. return list;
  48. }
  49. /// 资金账户各币种可用余额(对齐 Web `parseFundWalletBalances`)。
  50. Map<String, String> parseFundWalletBalances(dynamic raw) {
  51. final map = <String, String>{};
  52. final arr = raw is List
  53. ? raw
  54. : raw is Map<String, dynamic> && raw['data'] is List
  55. ? raw['data'] as List
  56. : null;
  57. if (arr == null) {
  58. return map;
  59. }
  60. for (final item in arr) {
  61. if (item is! Map<String, dynamic>) {
  62. continue;
  63. }
  64. final coin = item['coin'];
  65. final unit = '${item['coinUnit'] ?? (coin is Map ? coin['unit'] ?? coin['name'] : null) ?? item['unit'] ?? ''}'
  66. .toUpperCase()
  67. .trim();
  68. if (unit.isEmpty) {
  69. continue;
  70. }
  71. final bal = item['balance'] ?? item['available'] ?? item['useBalance'];
  72. map[unit] = '${bal ?? '0'}';
  73. }
  74. return map;
  75. }
  76. AccountInfo? pickStakingAccount(List<AccountInfo> list) {
  77. for (final row in list) {
  78. final name = row.name.trim();
  79. if (name.contains('质押') || name.toLowerCase().contains('staking')) {
  80. return row;
  81. }
  82. }
  83. return null;
  84. }
  85. String stakingOverviewLockedFromAccounts(List<AccountInfo> list) {
  86. final row = pickStakingAccount(list);
  87. if (row == null) {
  88. return '0';
  89. }
  90. return row.frozenBalance.toString();
  91. }