From bad88e9ce1fa6f48ce0ee2e72d5840f21468839d Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 4 Dec 2025 00:24:33 +0200 Subject: [PATCH] quick fixes for swap logic across providers (#2702) * fix currency matching and network mapping * add support for Arbitrum * Update lib/exchange/provider/exolix_exchange_provider.dart [skip ci] * Update lib/exchange/provider/exolix_exchange_provider.dart [skip ci] --------- Co-authored-by: Serhii-Borodenko <17529954+Serhii-Borodenko@users.noreply.github.com> Co-authored-by: Omar Hatem --- cw_core/lib/crypto_currency.dart | 11 +++++++++++ .../provider/changenow_exchange_provider.dart | 7 +++++-- .../provider/exolix_exchange_provider.dart | 13 +++++++++++-- .../provider/letsexchange_exchange_provider.dart | 11 ++++++++++- .../provider/stealth_ex_exchange_provider.dart | 14 ++++++++++++-- .../provider/trocador_exchange_provider.dart | 1 + 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 68066b12a..d3f9faf22 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -357,6 +357,17 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen return null; } + + // Try for native currency with same title and tag + if (tag == null || tag.isEmpty) { + final match = CryptoCurrency.all.firstWhereOrNull( + (e) => + e.title.toUpperCase() == raw.toUpperCase() && (e.tag == raw.toUpperCase()), + ); + + if (match != null) return match; + } + try { return CryptoCurrency.fromString(raw, walletCurrency: walletCurrency); } catch (_) {} diff --git a/lib/exchange/provider/changenow_exchange_provider.dart b/lib/exchange/provider/changenow_exchange_provider.dart index fef639b42..ca003b435 100644 --- a/lib/exchange/provider/changenow_exchange_provider.dart +++ b/lib/exchange/provider/changenow_exchange_provider.dart @@ -283,14 +283,14 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final fromCurrency = responseJSON['fromCurrency'] as String; final fromNetwork = responseJSON['fromNetwork'] as String?; final _normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); - final fromTag = fromCurrency == _normalizedFromNetwork ? null : _normalizedFromNetwork; + final fromTag = fromCurrency.toUpperCase() == _normalizedFromNetwork.toUpperCase() ? null : _normalizedFromNetwork; final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); // Parsing 'to' currency final toCurrency = responseJSON['toCurrency'] as String; final toNetwork = responseJSON['toNetwork'] as String?; final _normalizedToNetwork = _normalizeNetworkType(toNetwork ?? ''); - final toTag = toCurrency == _normalizedToNetwork ? null : _normalizedToNetwork; + final toTag = toCurrency.toUpperCase() == _normalizedToNetwork.toUpperCase() ? null : _normalizedToNetwork; final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); final inputAddress = responseJSON['payinAddress'] as String; @@ -326,6 +326,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { switch (currency) { case CryptoCurrency.usdt: return 'btc'; + case CryptoCurrency.arb: + return 'arbitrum'; default: return currency.tag != null ? _normalizeTag(currency.tag!) : currency.title.toLowerCase(); } @@ -360,6 +362,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { return switch (network.toUpperCase()) { 'POLY' => 'MATIC', 'AVAXC' => 'CCHAIN', + 'ARBITRUM' => 'ARB', _ => network, }; } diff --git a/lib/exchange/provider/exolix_exchange_provider.dart b/lib/exchange/provider/exolix_exchange_provider.dart index 645426de0..09b305620 100644 --- a/lib/exchange/provider/exolix_exchange_provider.dart +++ b/lib/exchange/provider/exolix_exchange_provider.dart @@ -364,13 +364,15 @@ class ExolixExchangeProvider extends ExchangeProvider { // Parsing 'from' currency final coinFrom = responseJSON['coinFrom']['coinCode'] as String; final coinFromNetwork = responseJSON['coinFrom']['network'] as String?; - final fromTag = coinFrom == coinFromNetwork ? null : coinFromNetwork; + final _normalizedFromNetwork = _normalizeNetworkType(coinFromNetwork ?? ''); + final fromTag = coinFrom.toUpperCase() == _normalizedFromNetwork.toUpperCase() ? null : coinFromNetwork; final from = CryptoCurrency.safeParseCurrencyFromString(coinFrom, tag: fromTag); // Parsing 'to' currency final coinTo = responseJSON['coinTo']['coinCode'] as String; final coinToNetwork = responseJSON['coinTo']['network'] as String?; - final toTag = coinTo == coinToNetwork ? null : coinToNetwork; + final _normalizedToNetwork = _normalizeNetworkType(coinToNetwork ?? ''); + final toTag = coinTo.toUpperCase() == _normalizedToNetwork.toUpperCase() ? null : coinToNetwork; final to = CryptoCurrency.safeParseCurrencyFromString(coinTo, tag: toTag); final inputAddress = responseJSON['depositAddress'] as String; @@ -417,6 +419,13 @@ class ExolixExchangeProvider extends ExchangeProvider { } } + String _normalizeNetworkType(String network) { + return switch (network.toUpperCase()) { + 'ARBITRUM' => 'ARB', + _ => network, + }; + } + String _normalizeCurrency(CryptoCurrency currency) { switch (currency) { case CryptoCurrency.nano: diff --git a/lib/exchange/provider/letsexchange_exchange_provider.dart b/lib/exchange/provider/letsexchange_exchange_provider.dart index fe9aebd12..d8ea8d6a1 100644 --- a/lib/exchange/provider/letsexchange_exchange_provider.dart +++ b/lib/exchange/provider/letsexchange_exchange_provider.dart @@ -434,7 +434,8 @@ class LetsExchangeExchangeProvider extends ExchangeProvider { return currency.tag!; } } - return currency.title; + + return _normalizeTitleToNetwork(currency.title); } String _normalizeNetworkType(String network) { @@ -442,10 +443,18 @@ class LetsExchangeExchangeProvider extends ExchangeProvider { 'ERC20' => 'ETH', 'TRC20' => 'TRX', 'BEP20' => 'BSC', + 'ARBITRUM' => 'ARB', _ => network, }; } + String _normalizeTitleToNetwork(String title) { + return switch (title.toUpperCase()) { + 'ARB' => 'ARBITRUM', + _ => title, + }; + } + String _normalizeBchAddress(String address) => address.startsWith('bitcoincash:') ? address.substring(12) : address; } diff --git a/lib/exchange/provider/stealth_ex_exchange_provider.dart b/lib/exchange/provider/stealth_ex_exchange_provider.dart index b87903fe7..cd639b6e1 100644 --- a/lib/exchange/provider/stealth_ex_exchange_provider.dart +++ b/lib/exchange/provider/stealth_ex_exchange_provider.dart @@ -346,13 +346,15 @@ class StealthExExchangeProvider extends ExchangeProvider { // Parsing 'from' currency with network tag final fromCurrency = deposit['symbol'] as String; final fromNetwork = deposit['network'] as String?; - final fromTag = fromNetwork == 'mainnet' ? null : fromNetwork; + final _normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); + final fromTag = _normalizedFromNetwork == 'mainnet' ? null : fromNetwork; final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); // Parsing 'to' currency with network tag final toCurrency = withdrawal['symbol'] as String; final toNetwork = withdrawal['network'] as String?; - final toTag = toNetwork == 'mainnet' ? null : toNetwork; + final _normalizedToNetwork = _normalizeNetworkType(toNetwork ?? ''); + final toTag = _normalizedToNetwork == 'mainnet' ? null : toNetwork; final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); final payoutAddress = withdrawal['address'] as String; @@ -440,7 +442,15 @@ class StealthExExchangeProvider extends ExchangeProvider { return currency.title.toLowerCase(); } + String _normalizeNetworkType(String network) { + return switch (network.toUpperCase()) { + 'ARBITRUM' => 'mainnet', + _ => network, + }; + } + String _getNetwork(CryptoCurrency currency) { + if (currency == CryptoCurrency.arb) return 'arbitrum'; if (currency.tag == null) return 'mainnet'; if (currency == CryptoCurrency.maticpoly) return 'mainnet'; diff --git a/lib/exchange/provider/trocador_exchange_provider.dart b/lib/exchange/provider/trocador_exchange_provider.dart index d4d89a210..f1e0d2ab0 100644 --- a/lib/exchange/provider/trocador_exchange_provider.dart +++ b/lib/exchange/provider/trocador_exchange_provider.dart @@ -523,6 +523,7 @@ class TrocadorExchangeProvider extends ExchangeProvider { 'TRC20' => 'TRX', 'BEP20' => 'BSC', 'LIGHTNING' => 'LN', + 'MATIC' => 'POL', _ => network, }; }