From ef895994aee9b52aa5e7dc4884e3ef998fe658c2 Mon Sep 17 00:00:00 2001 From: jwinterm Date: Sun, 17 May 2026 08:22:08 -0400 Subject: [PATCH] Remove Wyre buy-provider integration (shut down 2023) Delete the WyreBuyProvider + WyreOrderProviderAdapter source files, strip imports and call sites from buy/order view models and the buy webview, force isBitcoinBuyEnabled = false in di.dart, and drop the three wyreSecretKey/wyreApiKey/wyreAccountId entries from tool/utils/secret_key.dart. BuyProviderDescription.wyre (raw: 0) is kept as a no-op legacy entry so any old Hive-persisted order with that raw value still deserializes without throwing. Don't wire it back to UI/services. --- lib/buy/buy_provider_description.dart | 2 + lib/buy/wyre/wyre_buy_provider.dart | 173 ------------------ lib/di.dart | 4 +- .../wyre_order_provider_adapter.dart | 23 --- lib/src/screens/buy/buy_webview_page.dart | 5 - lib/view_model/buy/buy_view_model.dart | 11 +- lib/view_model/order_details_view_model.dart | 5 +- tool/utils/secret_key.dart | 3 - 8 files changed, 5 insertions(+), 221 deletions(-) delete mode 100644 lib/buy/wyre/wyre_buy_provider.dart delete mode 100644 lib/order/order_provider_adapter/wyre_order_provider_adapter.dart diff --git a/lib/buy/buy_provider_description.dart b/lib/buy/buy_provider_description.dart index d395c9df1..ad00bf1e7 100644 --- a/lib/buy/buy_provider_description.dart +++ b/lib/buy/buy_provider_description.dart @@ -6,6 +6,8 @@ class BuyProviderDescription extends EnumerableItem with Serializable final String image; + // raw: 0 was Wyre, removed (provider shut down 2023). Kept the constant + // for legacy Hive deserialization; do not wire it back into UI/services. static const wyre = BuyProviderDescription(title: 'Wyre', raw: 0, image: ''); static const moonPay = BuyProviderDescription(title: 'MoonPay', raw: 1, image: ''); diff --git a/lib/buy/wyre/wyre_buy_provider.dart b/lib/buy/wyre/wyre_buy_provider.dart deleted file mode 100644 index 46d08964a..000000000 --- a/lib/buy/wyre/wyre_buy_provider.dart +++ /dev/null @@ -1,173 +0,0 @@ -import 'dart:convert'; -import 'package:hash_wallet/buy/buy_exception.dart'; -import 'package:hash_wallet/order/order_source_description.dart'; -import 'package:hash_wallet/buy/pairs_utils.dart'; -import 'package:hash_wallet/entities/fiat_currency.dart'; -import 'package:cw_core/crypto_currency.dart'; -import 'package:cw_core/currency_for_wallet_type.dart'; -import 'package:cw_core/utils/proxy_wrapper.dart'; -import 'package:hash_wallet/buy/buy_amount.dart'; -import 'package:hash_wallet/buy/buy_provider.dart'; -import 'package:hash_wallet/buy/buy_provider_description.dart'; -import 'package:hash_wallet/order/order.dart'; -import 'package:cw_core/wallet_base.dart'; -import 'package:cw_core/wallet_type.dart'; -import 'package:hash_wallet/exchange/trade_state.dart'; -import 'package:hash_wallet/.secrets.g.dart' as secrets; - -class WyreBuyProvider extends BuyProvider { - WyreBuyProvider({required WalletBase wallet, bool isTestEnvironment = false}) - : baseApiUrl = isTestEnvironment ? _baseTestApiUrl : _baseProductApiUrl, - super( - wallet: wallet, - isTestEnvironment: isTestEnvironment, - hardwareWalletVM: null, - supportedCryptoList: supportedCryptoToFiatPairs( - notSupportedCrypto: _notSupportedCrypto, notSupportedFiat: _notSupportedFiat), - supportedFiatList: supportedFiatToCryptoPairs( - notSupportedFiat: _notSupportedFiat, notSupportedCrypto: _notSupportedCrypto)); - - static const _baseTestApiUrl = 'https://api.testwyre.com'; - static const _baseProductApiUrl = 'https://api.sendwyre.com'; - static const _trackTestUrl = 'https://dash.testwyre.com/track/'; - static const _trackProductUrl = 'https://dash.sendwyre.com/track/'; - static const _ordersSuffix = '/v3/orders'; - static const _reserveSuffix = '/reserve'; - static const _quoteSuffix = '/quote/partner'; - static const _timeStampSuffix = '?timestamp='; - static const _transferSuffix = '/v2/transfer/'; - static const _trackSuffix = '/track'; - static const _countryCode = 'US'; - static const _secretKey = secrets.wyreSecretKey; - static const _accountId = secrets.wyreAccountId; - - static const List _notSupportedCrypto = []; - static const List _notSupportedFiat = []; - - @override - String get title => 'Wyre'; - - @override - String get providerDescription => ''; - - @override - String get lightIcon => 'assets/images/robinhood_light.png'; - - @override - String get darkIcon => 'assets/images/robinhood_dark.png'; - - @override - bool get isAggregator => false; - - String get trackUrl => isTestEnvironment ? _trackTestUrl : _trackProductUrl; - - String baseApiUrl; - - Future requestUrl(String amount, String sourceCurrency) async { - final timestamp = DateTime.now().millisecondsSinceEpoch.toString(); - final url = baseApiUrl + _ordersSuffix + _reserveSuffix + _timeStampSuffix + timestamp; - final uri = Uri.parse(url); - final body = { - 'amount': amount, - 'sourceCurrency': sourceCurrency, - 'destCurrency': walletTypeToCryptoCurrency(wallet.type, chainId: wallet.chainId).title, - 'dest': walletTypeToString(wallet.type).toLowerCase() + ':' + wallet.walletAddresses.address, - 'referrerAccountId': _accountId, - 'lockFields': ['amount', 'sourceCurrency', 'destCurrency', 'dest'] - }; - final response = await ProxyWrapper().post( - clearnetUri: uri, - headers: { - 'Authorization': 'Bearer $_secretKey', - 'Content-Type': 'application/json', - 'cache-control': 'no-cache' - }, - body: json.encode(body), - ); - - if (response.statusCode != 200) { - throw BuyException(title: providerDescription, content: 'Url $url is not found!'); - } - - - final responseJSON = json.decode(response.body) as Map; - final urlFromResponse = responseJSON['url'] as String; - return urlFromResponse; - } - - Future calculateAmount(String amount, String sourceCurrency) async { - final quoteUrl = _baseProductApiUrl + _ordersSuffix + _quoteSuffix; - final body = { - 'amount': amount, - 'sourceCurrency': sourceCurrency, - 'destCurrency': walletTypeToCryptoCurrency(wallet.type, chainId: wallet.chainId).title, - 'dest': walletTypeToString(wallet.type).toLowerCase() + ':' + wallet.walletAddresses.address, - 'accountId': _accountId, - 'country': _countryCode - }; - final uri = Uri.parse(quoteUrl); - final response = await ProxyWrapper().post( - clearnetUri: uri, - headers: { - 'Authorization': 'Bearer $_secretKey', - 'Content-Type': 'application/json', - 'cache-control': 'no-cache' - }, - body: json.encode(body), - ); - - if (response.statusCode != 200) { - throw BuyException(title: providerDescription, content: 'Quote is not found!'); - } - - - final responseJSON = json.decode(response.body) as Map; - final sourceAmount = responseJSON['sourceAmount'] as double; - final destAmount = responseJSON['destAmount'] as double; - final achAmount = responseJSON['sourceAmountWithoutFees'] as double; - - return BuyAmount( - sourceAmount: sourceAmount, destAmount: destAmount, achSourceAmount: achAmount); - } - - Future findOrderById(String id) async { - final orderUrl = baseApiUrl + _ordersSuffix + '/$id'; - final orderUri = Uri.parse(orderUrl); - final orderResponse = await ProxyWrapper().get(clearnetUri: orderUri); - if (orderResponse.statusCode != 200) { - throw BuyException(title: providerDescription, content: 'Order $id is not found!'); - } - - final orderResponseJSON = json.decode(orderResponse.body) as Map; - final transferId = orderResponseJSON['transferId'] as String; - final from = orderResponseJSON['sourceCurrency'] as String; - final to = orderResponseJSON['destCurrency'] as String; - final status = orderResponseJSON['status'] as String; - final state = TradeState.deserialize(raw: status.toLowerCase()); - final createdAtRaw = orderResponseJSON['createdAt'] as int; - final createdAt = DateTime.fromMillisecondsSinceEpoch(createdAtRaw).toLocal(); - - final transferUrl = baseApiUrl + _transferSuffix + transferId + _trackSuffix; - final transferUri = Uri.parse(transferUrl); - final transferResponse = await ProxyWrapper().get(clearnetUri: transferUri); - if (transferResponse.statusCode != 200) { - throw BuyException(title: providerDescription, content: 'Transfer $transferId is not found!'); - } - - final transferResponseJSON = json.decode(transferResponse.body) as Map; - final amount = transferResponseJSON['destAmount'] as double; - - return Order( - id: id, - source: OrderSourceDescription.buy, - buyProvider: BuyProviderDescription.wyre, - transferId: transferId, - from: from, - to: to, - state: state, - createdAt: createdAt, - amount: amount.toString(), - receiveAddress: wallet.walletAddresses.address, - walletId: wallet.id); - } -} diff --git a/lib/di.dart b/lib/di.dart index 23edfd38f..2ea862746 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -371,9 +371,7 @@ Future setup({ }); } - final isBitcoinBuyEnabled = (secrets.wyreSecretKey.isNotEmpty) && - (secrets.wyreApiKey.isNotEmpty) && - (secrets.wyreAccountId.isNotEmpty); + const isBitcoinBuyEnabled = false; final settingsStore = await SettingsStoreBase.load( nodeSource: _nodeSource, diff --git a/lib/order/order_provider_adapter/wyre_order_provider_adapter.dart b/lib/order/order_provider_adapter/wyre_order_provider_adapter.dart deleted file mode 100644 index 5df6ab592..000000000 --- a/lib/order/order_provider_adapter/wyre_order_provider_adapter.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:hash_wallet/buy/wyre/wyre_buy_provider.dart'; -import 'package:hash_wallet/order/order.dart'; -import 'package:hash_wallet/order/order_provider.dart'; -import 'package:cw_core/wallet_base.dart'; - -class WyreOrderProviderAdapter implements OrderProvider { - WyreOrderProviderAdapter({required WalletBase wallet}) - : _wyreProvider = WyreBuyProvider(wallet: wallet); - - final WyreBuyProvider _wyreProvider; - - @override - Future<(Order, Object?)> findOrderById(String id) async { - final order = await _wyreProvider.findOrderById(id); - return (order, null); - } - - @override - String get title => _wyreProvider.title; - - @override - String get trackUrl => _wyreProvider.trackUrl; -} diff --git a/lib/src/screens/buy/buy_webview_page.dart b/lib/src/screens/buy/buy_webview_page.dart index 6d73e45bc..45f9e5bad 100644 --- a/lib/src/screens/buy/buy_webview_page.dart +++ b/lib/src/screens/buy/buy_webview_page.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'package:hash_wallet/buy/moonpay/moonpay_provider.dart'; -import 'package:hash_wallet/buy/wyre/wyre_buy_provider.dart'; import 'package:hash_wallet/generated/i18n.dart'; import 'package:hash_wallet/src/screens/base_page.dart'; import 'package:hash_wallet/store/dashboard/orders_store.dart'; @@ -54,10 +53,6 @@ class BuyWebViewPageBodyState extends State { _isSaving = false; widget.ordersStore.orderId = ''; - if (widget.buyViewModel.selectedProvider is WyreBuyProvider) { - _saveOrder(keyword: 'completed', splitSymbol: '/'); - } - if (widget.buyViewModel.selectedProvider is MoonPayProvider) { _saveOrder(keyword: 'transactionId', splitSymbol: '='); } diff --git a/lib/view_model/buy/buy_view_model.dart b/lib/view_model/buy/buy_view_model.dart index ac38dde94..9de4ae61c 100644 --- a/lib/view_model/buy/buy_view_model.dart +++ b/lib/view_model/buy/buy_view_model.dart @@ -1,5 +1,4 @@ import 'package:hash_wallet/buy/buy_provider.dart'; -import 'package:hash_wallet/buy/wyre/wyre_buy_provider.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:hash_wallet/entities/fiat_currency.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -87,14 +86,6 @@ abstract class BuyViewModelBase with Store { } Future _fetchBuyItems() async { - final List _providerList = []; - - if (wallet.type == WalletType.bitcoin) { - _providerList.add(WyreBuyProvider(wallet: wallet)); - } - - items = _providerList - .map((provider) => BuyItem(provider: provider, buyAmountViewModel: buyAmountViewModel)) - .toList(); + items = const []; } } diff --git a/lib/view_model/order_details_view_model.dart b/lib/view_model/order_details_view_model.dart index af22da786..635daedbb 100644 --- a/lib/view_model/order_details_view_model.dart +++ b/lib/view_model/order_details_view_model.dart @@ -8,7 +8,6 @@ import 'package:hash_wallet/generated/i18n.dart'; import 'package:hash_wallet/order/order.dart'; import 'package:hash_wallet/order/order_provider.dart'; import 'package:hash_wallet/order/order_provider_adapter/cake_pay_order_provider_adapter.dart'; -import 'package:hash_wallet/order/order_provider_adapter/wyre_order_provider_adapter.dart'; import 'package:hash_wallet/order/order_provider_description.dart'; import 'package:hash_wallet/order/order_source_description.dart'; import 'package:hash_wallet/src/screens/order_details/cake_pay_detail_list_card_item.dart'; @@ -39,9 +38,7 @@ abstract class OrderDetailsViewModelBase with Store { order = orderForDetails { switch (order.source) { case OrderSourceDescription.buy: - if (order.buyProvider == BuyProviderDescription.wyre) { - _provider = WyreOrderProviderAdapter(wallet: wallet); - } else if (order.buyProvider == BuyProviderDescription.moonPay) { + if (order.buyProvider == BuyProviderDescription.moonPay) { //_provider = MoonPayOrderProviderAdapter(appStore: null /* provide if needed */, wallet: wallet); } break; diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index ebde2f07c..2ed573477 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -14,9 +14,6 @@ class SecretKey { SecretKey('backupKeychainSalt', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), SecretKey('changeNowCakeWalletApiKey', () => ''), SecretKey('changeNowMoneroApiKey', () => ''), - SecretKey('wyreSecretKey', () => ''), - SecretKey('wyreApiKey', () => ''), - SecretKey('wyreAccountId', () => ''), SecretKey('moonPayApiKey', () => ''), SecretKey('moonPaySecretKey', () => ''), SecretKey('sideShiftAffiliateId', () => ''),